Infinity L oop при обновлении документа Firebase - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь обновить документ в моем Cloud Firestore, функция работает нормально при первом нажатии жизненного цикла приложения, но при втором запуске функция запускается и переходит в бесконечность l oop.

Я пробовал .update([Data]) и .set([Data]), они оба работают при первом нажатии и бесконечно при втором

func modifyInfoOwner(info: UserInfo){
    let fireStoreDB = Firestore.firestore()
    var documentID = ""
    fireStoreDB.collection("Users").whereField("email", isEqualTo: info.email).addSnapshotListener(includeMetadataChanges: false) { (snapshot, error) in
        if error != nil {
            print(error?.localizedDescription)
        } else {
            if snapshot?.isEmpty != true && snapshot != nil {
                for document in snapshot!.documents {
                    print("| saving info in DB")
                    print("v")
                    print(info)
                    documentID = document.documentID
                    //                        fireStoreDB.collection("Users").document(documentID)
                    fireStoreDB.collection("Users").document(documentID).setData(["adress" : info.adress, "name" : info.name, "phone" : info.phoneNumber, "seatQuantity" : info.seatQuantity, "email" : info.email, "token" : info.token]){ error in
                        if let error = error {
                            print("Data could not be saved: \(error).")
                        } else {
                            print("Data saved successfully!")
                        }
                    }
                }
            }
        }
    }
}

}

1 Ответ

0 голосов
/ 09 июля 2020

Вы обновляете тот же документ, который запрашиваете. А поскольку вы используете addSnapshotListener, слушатель остается активным после того, как впервые получит данные. Поэтому, когда вы вызываете setData в документе, ваш слушатель снова запускается, что снова вызывает setData, и это ваш бесконечный l oop.

Решение здесь - использовать getDocuments вместо addSnapshotListener. С getDocuments вы читаете данные только один раз, поэтому обновление не запускает их снова.

fireStoreDB.collection("Users")
  .whereField("email", isEqualTo: info.email)
  .getDocuments(includeMetadataChanges: false) { (snapshot, error) in
      ...

Остальную часть вашего кода менять не нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...