Firestore iOS - 为啥我的阵列多次打印出来?
Posted
技术标签:
【中文标题】Firestore iOS - 为啥我的阵列多次打印出来?【英文标题】:Firestore iOS - Why does my array get printed out multiple times?Firestore iOS - 为什么我的阵列多次打印出来? 【发布时间】: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
做了什么,所以它也可能是一个问题。
【参考方案1】:
你不应该在这里调用你的 update():-
for document in snapshot!.documents
let id = document.documentID
self.getUser(id, completion: (user) in
self.friendList.append(user)
update()
)
您应该在 for 循环完成后调用它。
【讨论】:
新的“呼叫”会去哪里? @C.Agu 如 cmets 中所建议,您可以在 for 循环结束后调用update()
,不需要 if snapshot!.documents.count == 0 update()
嗨@AppDev,当我这样做时,我得到一个空数组,为什么会这样?
因为它可能会在 for 循环完成之前被调用尝试在 update() 处设置断点并检查以上是关于Firestore iOS - 为啥我的阵列多次打印出来?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Firestore 返回一个集合引用,但我的程序将其视为一个数组?