в моем проекте я пытаюсь реализовать социальное приложение, включающее запрос друзей с использованием облачной 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
}
}
}