为啥我的 firebase 监听器重复记录
Posted
技术标签:
【中文标题】为啥我的 firebase 监听器重复记录【英文标题】:why my firebase listener duplicate the record为什么我的 firebase 监听器重复记录 【发布时间】:2020-08-03 03:21:39 【问题描述】:在我的项目中,我尝试使用 Cloud Firebase 实现一个社交应用,包括好友请求
我找不到避免火基监听器重复记录的解决方案!
在第一次打开时,列表是正确的并且会更新,但如果出于任何原因我添加了朋友,听众会重复记录。
如果我检查我的数据库 Firestore,记录只有一个,没有双重记录。
如果我退出并返回视图,所有记录都正常。
这里是我添加朋友时发生的事情的图片。
我附上我的部分代码:
func testUpdatePendingUser(userLoggato: UserModel, utenteADDED: @escaping (UserModel)->(), vettoreUser: @escaping ([UserModel])->())
db.collection("user").document(userLoggato.userID).collection("pendingFriends")
.addSnapshotListener(includeMetadataChanges: false) documentSnapshot, error in
var arrayUtentiStart = [UserModel]()
guard let snapshot = documentSnapshot else return
snapshot.documentChanges.forEach (documentChange) in
switch documentChange.type
case .added :
debugPrint("add")
let dict = documentChange.document.data()
let name = dict["name"] as? String ?? "na name"
let surname = dict["surname"] as? String ?? "na name"
let email = dict["email"] as? String ?? "na name"
let userLevel = dict["adminLevel"] as? String ?? "unable to get admin level"
let idUser = dict["userID"] as? String ?? "no ID"
let position1 = dict["position"] as? String ?? "na preferance position"
let position2 = dict["position2"] as? String ?? "na preferance position"
let vote = dict["vote"] as? Int ?? 0
self.downloadImageForAdmin(userID: idUser) (urlImage) in
let utente = UserModel(name: name, surname: surname, email: email, userID: idUser, adminLevel: userLevel, immagine: urlImage, position: position1, position2: position2, vote: vote)
utenteADDED(utente)
arrayUtentiStart.append(utente)
vettoreUser(arrayUtentiStart)
case .modified :
debugPrint("mod")
case .removed :
debugPrint("rem")
这将在 contentView 上使用
func newPendinguser(userLoggato: UserModel)
usersPendingNEW = []
testUpdatePendingUser(userLoggato: userLoggato, utenteADDED: (utenteCambiato) in
if !self.usersPendingNEW.isEmpty // case is not empty , guess problem is here!!
self.usersPendingNEW.append(utenteCambiato)
) (vettoreIniziale) in
if self.usersPendingNEW.isEmpty // first view appear
self.usersPendingNEW = vettoreIniziale
【问题讨论】:
【参考方案1】:我认为这段代码会重复你的数据。
utenteADDED(utente)
arrayUtentiStart.append(utente)
vettoreUser(arrayUtentiStart)
您设计 utenteADDED(utente) 在第一次初始化时运行,但是当您在数组中有数据时,该代码仍然运行。
在运行此代码之前检查首次运行:
utenteADDED(utente)
【讨论】:
【参考方案2】:清除呈现视图的数组,然后分配通过监听器接收到的列表
【讨论】:
以上是关于为啥我的 firebase 监听器重复记录的主要内容,如果未能解决你的问题,请参考以下文章
如何按两个字段对 Firebase 记录进行排序(Android)[重复]
如何按两个字段对 Firebase 记录进行排序(Android)[重复]
如何按两个字段对 Firebase 记录进行排序(Android)[重复]