Ios Firebase Firestore快照侦听器数据重复问题

Ios Firebase Firestore快照侦听器数据重复问题,ios,swift,firebase,google-cloud-firestore,Ios,Swift,Firebase,Google Cloud Firestore,我正在使用firestore和iglistkit在集合视图上显示数据。我试图理解为什么我的快照侦听器会被同一个对象调用两次 问题摘要: 在Viewdidload上,我调用fetchUserFriends()方法,并从querySnapshot接收我期望的文档,但由于未知原因,方法体被调用了两次,而没有对数据进行任何更改 问题代码如下所示: func fetchUserFriends() { guard let currentUserId = currentUser?.uid e

我正在使用firestore和iglistkit在集合视图上显示数据。我试图理解为什么我的快照侦听器会被同一个对象调用两次

问题摘要: 在Viewdidload上,我调用
fetchUserFriends()
方法,并从querySnapshot接收我期望的文档,但由于未知原因,方法体被调用了两次,而没有对数据进行任何更改

问题代码如下所示:

 func fetchUserFriends() {
        guard let currentUserId = currentUser?.uid else { return }
        db.collection("friends").whereField(FriendState.isRelationshipActive, isEqualTo: true).whereField("members", arrayContains: currentUserId).order(by: "createdAt", descending: true).addSnapshotListener { [weak self] (querySnapshot, error) in

            if(error != nil) {
                print("error \(String(describing: error?.localizedDescription))")
            }

            guard let querySnapshot =  querySnapshot else { return }

            for document in querySnapshot.documents {
                let friendRelation = UserRelation.init(document: document)
                if(self?.friendsRelations != nil) {
                    self?.friendsRelations?.append(friendRelation)
                } else {
                    self?.friendsRelations = [friendRelation]
                }
            }
            self?.adapter.reloadData(completion: nil)
        }
    }
根据我的调试,结果是:

  • 调用fetchUserFriends()
  • 通过guard let querySnapshot=querySnapshot else{return}并将数据添加到
    friendRelations
    数组中
  • self?.adapter.reloadData(完成:nil)
  • 然后,下面这行就开始了

  • 并使用相同的对象再次返回第二步,在本例中,由于iglistkit重复标识符,该对象失败


  • 谢谢你的帮助

    我也在讨论同样的问题。奇怪的是,我有不同的侦听器,每个文档一个。一次触发一次。另一个两次。我找到了一种方法来阻止它触发两次

     if !snapshot.metadata.hasPendingWrites { // filters the local snapshot
        let myobj = Myobj(document: snapshot)
        completion(myobj)
     }
    
    原因是它正在跟踪本地和服务器端的更改,这将进行过滤,以仅获得服务器端确认。
    现在,这为什么只为一个同样设置的监听器触发本地快照对我来说仍然是个谜。希望它能帮助别人

    我也在讨论同样的问题。奇怪的是,我有不同的侦听器,每个文档一个。一次触发一次。另一个两次。我找到了一种方法来阻止它触发两次

     if !snapshot.metadata.hasPendingWrites { // filters the local snapshot
        let myobj = Myobj(document: snapshot)
        completion(myobj)
     }
    
    原因是它正在跟踪本地和服务器端的更改,这将进行过滤,以仅获得服务器端确认。
    现在,这为什么只为一个同样设置的监听器触发本地快照对我来说仍然是个谜。希望它能帮助别人

    问题有点不清楚-我们需要了解FireStore的结构。你能把这个包括在问题里吗?此外,您正在为每个正在读取的节点添加一个侦听器。我猜您可能想使用getDocuments来代替。请注意,您的.orderBy无法正常工作。order(by)要求其中一个where子句包含与ordering by相同的字段。您最好(在本例中)删除.order(通过代码进行排序或探索。问题有点不清楚-我们需要了解FireStore结构。你能在问题中包括这一点吗?另外,你正在为每个正在读取的节点添加一个侦听器。我猜你可能想使用getDocuments来代替。请注意,.orderBy不能按原样工作..order(by要求其中一个where子句包含与排序依据相同的字段。在本例中,您最好删除.order(by)并在代码中进行排序或探索。