回答編集履歴

3

コード修正

2018/07/12 06:18

投稿

f-miyu
f-miyu

スコア1625

test CHANGED
@@ -120,7 +120,7 @@
120
120
 
121
121
  //追加
122
122
 
123
- group.notify(queue: .main, work: { [weak self] in
123
+ group.notify(queue: .main, execute: { [weak self] in
124
124
 
125
125
  self?.delegate?.dataReceived(contacts: contacts)
126
126
 

2

コード修正

2018/07/12 06:18

投稿

f-miyu
f-miyu

スコア1625

test CHANGED
@@ -110,23 +110,25 @@
110
110
 
111
111
  })
112
112
 
113
-                  
114
-
115
- //追加
116
-
117
- group.notify(queue: .main, work: { [weak self] in
118
-
119
- self?.delegate?.dataReceived(contacts: contacts)
120
-
121
- })
122
-
123
113
  }
124
114
 
125
115
  }
126
116
 
127
117
  }
128
118
 
119
+
120
+
121
+ //追加
122
+
123
+ group.notify(queue: .main, work: { [weak self] in
124
+
125
+ self?.delegate?.dataReceived(contacts: contacts)
126
+
127
+ })
128
+
129
129
  }
130
+
131
+
130
132
 
131
133
  }
132
134
 

1

回答の追記

2018/07/12 05:47

投稿

f-miyu
f-miyu

スコア1625

test CHANGED
@@ -3,3 +3,141 @@
3
3
 
4
4
 
5
5
  `self.delegate?.dataReceived`で取得したデータを`ContactsVC`に渡しているようですが、渡した後に、`tableView.reloadData()`を呼び出せば、再度テーブルの更新がされるはずです。
6
+
7
+
8
+
9
+ ---
10
+
11
+
12
+
13
+ 今の`getContacts`では、ユーザーの全情報を取得したあと、`dataReceived`が、すぐに呼び出されてしまうので、空のままContactsVCに渡されてしまいます。
14
+
15
+ `DispatchGroup`を使えば、すべてのデータを`contacts`に追加した後に、`dataReceived`を呼び出すようにできます。
16
+
17
+
18
+
19
+ ```swift
20
+
21
+ func getContacts() {
22
+
23
+
24
+
25
+ //以下、Firebaseから全ユーザーの情報を取りに行く
26
+
27
+ Database.database().reference().child("Contacts").observeSingleEvent(of: DataEventType.value) {
28
+
29
+ (snapshot: DataSnapshot) in
30
+
31
+
32
+
33
+ var contacts = [Contact]();
34
+
35
+
36
+
37
+ if let myContacts = snapshot.value as? NSDictionary{
38
+
39
+
40
+
41
+ let group = DispatchGroup() //追加
42
+
43
+
44
+
45
+ for (key, value) in myContacts {
46
+
47
+ if let contactData = value as? NSDictionary {
48
+
49
+ if let name = contactData[Constants.NAME] as? String {
50
+
51
+ let profileImageUrl = contactData[Constants.PROFILE_IMAGE] as! String
52
+
53
+ let id = key as! String;
54
+
55
+ let newContact = Contact(id: id, name: name, profileImageUrl: profileImageUrl);
56
+
57
+
58
+
59
+     let friendusername3 = contactData["username"] as! String
60
+
61
+
62
+
63
+ print("step1")
64
+
65
+
66
+
67
+ group.enter() //追加
68
+
69
+
70
+
71
+ //以下、Firebaseから現在ログインしてるユーザーの友達登録されているユーザーの情報を取りに行く
72
+
73
+ var uid = Auth.auth().currentUser?.uid
74
+
75
+ Database.database().reference().child("Contacts").child(uid!).child("friendusername").observeSingleEvent(of: .value, with: { (snapshot) in
76
+
77
+ if let c = snapshot.value as? [String:AnyObject]{
78
+
79
+ let myFriendUserName = c[id] as? String
80
+
81
+ if myFriendUserName != nil {
82
+
83
+
84
+
85
+
86
+
87
+ //現在ログインしてるユーザーの友達として登録されているユーザー名(myFriendUserName)と、他の全登録ユーザーのユーザー名が一致したとき、
88
+
89
+ if myFriendUserName! == friendusername3 {
90
+
91
+ contacts.append(newContact)
92
+
93
+ print("step2")
94
+
95
+
96
+
97
+ }
98
+
99
+ }
100
+
101
+
102
+
103
+
104
+
105
+ }
106
+
107
+
108
+
109
+ group.leave() //追加
110
+
111
+ })
112
+
113
+                  
114
+
115
+ //追加
116
+
117
+ group.notify(queue: .main, work: { [weak self] in
118
+
119
+ self?.delegate?.dataReceived(contacts: contacts)
120
+
121
+ })
122
+
123
+ }
124
+
125
+ }
126
+
127
+ }
128
+
129
+ }
130
+
131
+ }
132
+
133
+
134
+
135
+ } //getContact関数終わり
136
+
137
+ ```
138
+
139
+
140
+
141
+ ついでにアドバイスなのですが、全ユーザーのforループ内で、毎回、同じログインユーザーの登録友達名の情報を取得しているので、かなり無駄です。また、全ユーザー情報を一気に取得するのは、ユーザーが少なければ問題はないかもですが、多くなってくると処理時間的にも問題になってくるかもしれません。
142
+
143
+ 今回の場合、ログインユーザーの友達の情報を取得するのが目的なので、最初にログインユーザーの登録友達名の情報を取得した後に、その取得した友達のIDをから、その友達のみの情報を取得するようにすれば、無駄な処理を省けるかと思います。