【发布时间】:2020-06-28 09:08:10
【问题描述】:
我成功地能够在表格视图中显示用户朋友数组,但是当我打印出数组时,它被打印了 3 次而不是 1 次,我该如何解决这个问题?
好友系统模型:
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()
})
}
if snapshot!.documents.count == 0 {
update()
}
}
}
func removeFriendObserver() {
removeFriendListener.remove()
}
好友系统视图控制器:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
FriendSystem.system.addFriendObserver { () in
DispatchQueue.main.async {
self.tableView.reloadData()
}
print(FriendSystem.system.friendList)
}
}
数组打印出来
[App.User]
[App.User, App.User]
[App.User, App.User, App.User]
【问题讨论】:
-
因为您在循环的每次迭代中都调用了闭包。仅在循环之后调用它。
-
@JoakimDanielson 的代码是什么样子的
-
仅将
if snapshot!.documents.count == 0 { update()}替换为update() -
我不知道,也许你做错了。
-
因为有3个朋友所以打印了3次?
for document in snapshot!.documents。此外,您还拥有 DispatchQueue,因为在 Firebase 闭包中进行的任何调用都是在主线程上完成的,因此您确实不需要它。为简单起见,可以删除许多无关代码 - 根据代码,您根本不需要完成处理程序。我们也不知道这个self.getUser做了什么,所以它也可能是一个问题。
标签: ios swift firebase google-cloud-firestore