Это фактически ожидаемый результат, так как данные загружаются из 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