почему мой слушатель firebase дублирует запись - PullRequest
0 голосов
/ 03 августа 2020

в моем проекте я пытаюсь реализовать социальное приложение, включающее запрос друзей с использованием облачной firebase

Я не могу найти решение, чтобы избежать дублирования записи слушателем базы огня!

при первом открытии список правильный и обновляется, но если по какой-либо причине я добавляю друзей, слушатель дублирует запись.

если я проверяю свою базу данных Firestore, запись будет только одна, двойной записи нет .

если я выйду и go вернусь к просмотру, все записи в порядке.

вот изображение того, что происходит, когда я добавляю друзей.

введите описание изображения здесь

Я прикрепляю свою часть моего кода:

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
            }
            
        }
    }

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

Очистить массив, который представляет представление, а затем назначить список, полученный через прослушиватель

0 голосов
/ 03 августа 2020

я думаю, этот код будет дублировать ваши данные.

utenteADDED(utente) 

arrayUtentiStart.append(utente) 

vettoreUser(arrayUtentiStart)

вы разрабатываете utenteADDED (utente), запускаемый при первом запуске, но когда у вас есть данные в массиве, этот код все еще выполняется.

Проверьте первый запуск перед запуском этого кода:

utenteADDED(utente) 
...