我正在使用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)
}
}
根据我的调试,会发生什么:
friendRelations
数组self?.adapter.reloadData(completion: nil)
,并使用相同的对象再次返回第二步,在这种情况下,由于iglistkit重复标识符,该对象失败。
感谢您的帮助。
答案 0 :(得分:0)
我在这里遇到同样的问题。奇怪的是,我有不同的侦听器,每个文档一个。一个触发一次。另一个两次。我找到了一种方法来阻止它触发两次。
if !snapshot.metadata.hasPendingWrites { // filters the local snapshot
let myobj = Myobj(document: snapshot)
completion(myobj)
}
解释是它正在跟踪本地和服务器端更改,这将进行过滤以仅获取服务器端确认。 现在,为什么仅触发一个相等设置侦听器的本地快照的原因,对我来说仍然是个谜。希望它可以帮助某人。