Быстрое восстановление пользовательских объектов из запроса при прослушивании обновлений в реальном времени с помощью snapshotListener - PullRequest
0 голосов
/ 03 мая 2020

У меня есть проблемы с преобразованием querySnapshots, которое наблюдается для изменений с snapshotListener в пользовательские объекты.

Это мой код, но компилятор жалуется:

func getCartData(db: Firestore){
        db.collection("test")
        .whereField("Cart", arrayContains: "testItem")
        .addSnapshotListener { querySnapshot, error in
            guard let documents = querySnapshot?.documents else {
                print("Error fetching document: \(error!)")
                return
            }
            for doc in documents {
                guard let data = doc.data() else { //here is an error saying: Initializer for conditional binding must have Optional type, not '[String : Any]'
                  print("Document data was empty.")
                  return
                }

                let result = Result {
                  try doc.data(as: CartDataDocument.self)
                }
                switch result {
                case .success(let userDataDoc):
                    if let userDataDoc = userDataDoc {
                      // A `userDataDoc` value was successfully initialized from the DocumentSnapshot.
                      self.cartData = userDataDoc
                    } else {
                      // A nil value was successfully initialized from the DocumentSnapshot,
                      // or the DocumentSnapshot was nil.
                      print("Document does not exist")
                    }
                case .failure(let error):
                    // A `userDataDoc` value could not be initialized from the DocumentSnapshot.
                    print("Error decoding UserDataDocument: \(error)")
                }
            }
        }
    }

Мне удалось создать пользовательские объекты из одного документа Firestore, который прослушивался с snapshotListener, но мне не повезло с этим запросом.

1 Ответ

1 голос
/ 03 мая 2020

Ошибка кажется правильной . Если вы посмотрите на объявление, которое Xcode показывает во время автозаполнения, doc.data() действительно не может обнуляться [String: Any].

Если вы хотите проверить, является ли документ пустым, вы можете сделать это следующим образом:

guard !doc.data().isEmpty else {
    print("Document data was empty.")
    return
}

В противном случае вы также можете переопределить init(from decoder: Decoder) throws в CartDataDocument и указать значения по умолчанию для всех клавиш. Это, очевидно, идет в другом направлении: вместо игнорирования пустых документов вы добавляете их в список со значениями по умолчанию. Но я должен спросить: почему у вас есть пустые документы?

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