【问题标题】: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
            }
            
        }
    }

【问题讨论】:

    标签: arrays swift firebase google-cloud-firestore swiftui


    【解决方案1】:

    我认为这段代码会重复你的数据。

    utenteADDED(utente) 
    
    arrayUtentiStart.append(utente) 
    
    vettoreUser(arrayUtentiStart)
    

    您设计 utenteADDED(utente) 在第一次初始化时运行,但是当您在数组中有数据时,该代码仍然运行。

    在运行此代码之前检查首次运行

    utenteADDED(utente) 
    

    【讨论】:

      【解决方案2】:

      清除呈现视图的数组,然后分配通过监听器接收到的列表

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-28
        • 2014-06-11
        相关资源
        最近更新 更多