【问题标题】: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 做了什么,所以它也可能是一个问题。

标签: ios swift firebase google-cloud-firestore


【解决方案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() 处设置断点并检查
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
相关资源
最近更新 更多