为啥我的 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)[重复]

如何在不监听事件的情况下从 firebase 数据库中检索数据 [重复]

如何将 Bigquery 重复记录转换为列?

为啥我在解析 XML 时会从此方法中得到重复记录?