Почему я не могу присвоить извлеченные значения из Firestore массиву в Swift? - PullRequest
0 голосов
/ 09 сентября 2018

Я несколько раз пытался различными способами назначить собранные значения документов из хранилища в массив. К сожалению, я не смог найти способ решить эту проблему. Я приложил код, который недавно пытался реализовать. Он включает перед закрытием Firestore оператор print, который успешно печатает все извлеченные значения Однако после закрытия я попытался напечатать тот же массив, и в результате получился пустой массив.

Я пытался реализовать этот код

var hotelCities: [String] = []

func getCities() {
    db.collection("Hotels").getDocuments() { (querySnapshot,  err) in
        if let err = err {
            print("Error getting documents: \(err)")
        } else {
            for document in querySnapshot!.documents {
                var found = false
                let documentDetails = document.data() as NSDictionary
                let location = documentDetails["Location"] as! NSDictionary
                let city = location["city"]!
                if (self.hotelCities.count == 0) {
                    self.hotelCities.append(String(describing: city))
                }
                else{
                    for item in self.hotelCities {
                        if item == String(describing: city){
                            found = true
                        }
                    }
                    if (found == false){
                        self.hotelCities.append(String(describing: city))
                    }
                }
            }
        }
        print(self.hotelCities)
    }
    print(self.hotelCities)
}

1 Ответ

0 голосов
/ 09 сентября 2018

Это фактически ожидаемый результат, так как данные загружаются из Firestore асинхронно.

После того, как вы позвоните getDocuments(), клиент Firestore выходит и подключается к серверу для чтения этих документов. Поскольку это может занять довольно много времени, оно позволяет вашему приложению продолжать работу в это время. Затем, когда документы доступны, он вызывает ваше закрытие. Но это означает, что документы доступны только после вызова закрытия.

Проще всего понять этот поток, поместив несколько операторов печати:

print("Before starting to get documents");
db.collection("Hotels").getDocuments() { (querySnapshot,  err) in
  print("Got documents");
}
print("After starting to get documents");

Когда вы запустите этот код, он напечатает:

Перед началом получения документов

После начала получения документов

Получил документы

Теперь, когда вы впервые увидели этот код, это, вероятно, не тот результат, который вы ожидали. Но это полностью объясняет, почему print(self.hotelCities), который у вас есть после закрытия, ничего не печатает: данные еще не загружены.

Быстрое решение состоит в том, чтобы убедиться, что весь код, который нуждается в документах, находится внутри закрытия, которое вызывается при загрузке документов. Точно так же, как ваш топ print(self.hotelCities) оператор уже.

Альтернативой является определение собственного замыкания, как показано в этом ответе: https://stackoverflow.com/a/38364861

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