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

时间:2019-03-10 04:21:32

标签: ios swift firebase google-cloud-firestore

我正在使用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)
        }
    }

根据我的调试,会发生什么:

  1. fetchUserFriends()被调用
  2. 仔细检查,让querySnapshot = querySnapshot else {return}并将数据添加到friendRelations数组
  3. self?.adapter.reloadData(completion: nil)
  4. 然后运行下面的行 Then this code runs

  5. ,并使用相同的对象再次返回第二步,在这种情况下,由于iglistkit重复标识符,该对象失败。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

 if !snapshot.metadata.hasPendingWrites { // filters the local snapshot
    let myobj = Myobj(document: snapshot)
    completion(myobj)
 }

解释是它正在跟踪本地和服务器端更改,这将进行过滤以仅获取服务器端确认。 现在,为什么仅触发一个相等设置侦听器的本地快照的原因,对我来说仍然是个谜。希望它可以帮助某人。