ios - Firebase iOS - 调用时数组为空
问题描述
当为我的数组调用我的侦听器时,它返回一个空数组而不是正确的元素,这是为什么呢?
模型:
var friendList = [User]()
var removeFriendListener: ListenerRegistration!
func addFriendObserver(_ update: @escaping () -> Void) {
removeFriendListener = CURRENT_USER_FRIENDS_REF.addSnapshotListener{ snapshot, error in
self.friendList.removeAll()
guard error == nil else {
#if DEBUG
print("Error retreiving collection")
#endif
return
}
for document in snapshot!.documents {
let id = document.documentID
self.getUser(id, completion: { (user) in
self.friendList.append(user)
})
}
update()
}
}
视图控制器:
FriendSystem.system.addFriendObserver { () in
FriendSystem.system.friendList.sort(by: {$0.username < $1.username})
self.tableView.reloadData()
print(FriendSystem.system.friendList)
}
解决方案
它看起来像这样:
func addFriendObserver(_ update: @escaping () -> Void) {
removeFriendListener = CURRENT_USER_FRIENDS_REF.addSnapshotListener { snapshot, error in
self.friendList.removeAll()
guard error == nil else {
#if DEBUG
print("Error retrieving collection")
#endif
return
}
let group = DispatchGroup()
for document in snapshot!.documents {
let id = document.documentID
group.enter()
self.getUser(id, completion: { (user) in
self.friendList.append(user)
group.leave()
})
}
group.notify(queue: .main) {
update()
}
}
}
基本上,对于每个文档,一个块将进入该组,该块将一直保留到getUser
完成。之后,当组完成时,它会通知你,这样你就可以确定你想要执行的所有事情都被执行了。
dispatchQueue
编辑:因为未使用而被删除,我自己将它用于通知队列。
推荐阅读
- c# - 当我应该获得 200 状态时,ASP.NET GET 请求获得 204 状态
- node.js - 如何在数据流上使用 mailparser.simplemailparser?
- python - 使用 spacy 依赖解析的字典中的句子分割
- angular - 从 graphapi 获取用户照片并将其设置为 Angular 应用程序中的个人资料图片
- mysql - 如何编写 SQL 查询以获得以下输出
- javascript - 不要用网格和纵横比溢出容器
- php - 使用 Lumen Laravel 下载文件
- c++ - 根据用户的“字符串”输入在 C++ 中打开文件
- junit - 我们如何模拟 sping boot 中的每一行进行测试
- javascript - 在异步回调上设置状态时防止“对未安装的组件做出反应状态更新”警告