【发布时间】:2018-01-02 16:35:17
【问题描述】:
以下函数必须返回我所有用户的好友列表。然而,它只为其中一个朋友做。我知道这是因为 2 个 firebase 函数正在异步运行,但是我不确定我必须更改函数以使其按应有的方式运行。即检索所有好友。
///retrieves all of user's friends
func fetchFriends(completion: @escaping ([FriendModel])->()){
FRIEND_REQ_REF.child(CURRENT_USER_ID).observe(.childAdded, with: {(snapshot) in
var friends = [FriendModel]()
if snapshot.value as? Int == 0 {
self.USERS_REF.child(snapshot.key).observeSingleEvent(of: .value, with: {(snap) in
if let dictionary = snap.value as? [String : AnyObject]{
let friend = FriendModel()
friend.setValue(dictionary["userName"], forKey: "userName")
friend.setValue(dictionary["name"], forKey: "name")
friends.append(friend)
completion(friends)
}
})
}
})
}
这是我的数据结构:
FRIEND_REQ_REF
firebaseUserID
friendFirebasegivenID : 0
anotherFriendFirebasegivenID : 0
USERS_REF
friendFirebasegivenID
userName : String
name : String
anotherFriendFirebasegivenID : 0
userName : String
name : String
【问题讨论】:
-
我认为通过使用 observeSingleEvent 您不是从服务器中提取数据,而是从本地缓存中提取数据。尝试使用观察或查看 keepSynced。
-
这实际上不是问题。那部分工作正常。这个函数的作用是从 FRIENDS_REQ_REF 中提取用户的所有朋友,然后根据他们的用户名提取他们的快照值。问题是一开始它必须拉动所有用户,它只做一个。我想我需要像 for 循环这样的东西来处理所有快照值,但是没有这样的东西,所以我不知道如何解决这个问题
-
我看错了你的代码。一旦你拉出 FRIEND_REQ_REF,下面的所有数据也应该被拉出。无需再次从火力基地拉出。删除代码,只需执行 print(snapshot.value) 即可查看结构。它应该是一本包含一切的字典。
-
实际上,一旦我拉出friend_req_ref,它就不会拉出所有数据。我也需要第二部分。看,我正在做的是从一个节点中找到当前用户的朋友,然后在另一个节点中查找他们的信息,称为 urers_ref 节点。我想我也应该对我的数据结构做一个图表,我会编辑它
-
你能打印(snapshot.value)并发布吗?我需要查看正在返回的结构
标签: swift firebase asynchronous firebase-realtime-database data-synchronization