Я пытаюсь использовать DispatchQueue, чтобы заставить мой код ждать, пока запрос извлечет нужные мне результаты из Cloud Firestore, прежде чем он продолжит выполняться, но просто не смог заставить его работать. В приведенном ниже коде я пытаюсь заставить его ждать, пока данные не будут извлечены и сохранены в zoneMarkerArray, а затем распечатать результат.
Я пронумеровал каждую напечатанную строку в том порядке, в котором я хочу, чтобы это происходило, и, как вы увидите на выходе, он не ждет результата Firestore, прежде чем двигаться дальше.
Вот мой код:
let zones = self.db.collection("zones")
let zonesQuery = zones.whereField("start", isGreaterThan: lowerLimit).whereField("start", isLessThan: upperLimit)
print("1. zones Query has been defined")
//pass zonesQuery query to getZoneMarkers function to retrieve the zone markers from Firestore
getZoneMarkers(zonesQuery)
print("6. Now returned from getZoneMarkers")
func getZoneMarkers(_ zonesQuery: Query) -> ([Double]) {
print("2. Entered getZoneMarkers function")
DispatchQueue.global(qos: .userInteractive).async {
zonesQuery.getDocuments() { (snapshot, error) in
if let error = error {
print("Error getting zone markers: \(error)")
} else {
print("3. Successfully Retrieved the zone markers")
var result: Double = 0.0
for document in snapshot!.documents {
print("Retrieved zone marker is \(document["start"]!)")
self.zoneMarkerArray.append(document["start"]! as! Double)
print("4. Looping over zone marker results")
}
}
}
DispatchQueue.main.async {
//I want this the printCompleted function to print the result AFTER the results have been retrieved
self.printCompleted()
}
}
return self.zoneMarkerArray
}
func printCompleted() {
print("5. Looping now completed. Result was \(zoneMarkerArray)")
}
А вот вывод, который выводится:
- Зоны Запрос был определен
- Введена функция getZoneMarkers
- Теперь возвращается из getZoneMarkers
- Цикл теперь завершен. Результат был [0.0]
- Успешно извлечены маркеры зоны
- Цикл по результатам маркера зоны
- Цикл по результатам маркера зоны Получен маркер зоны 12.0
- Цикл результаты маркера над зоной
Спасибо за помощь!
РЕДАКТИРОВАТЬ: В случае, если кто-то еще сталкивается с этим, вот рабочий код, который я собрал в конце на основе обратная связь, которую я получил. Пожалуйста, не стесняйтесь критиковать, если вы видите, как это может быть улучшено:
let zones = self.db.collection("zones")
let zonesQuery = zones.whereField("start", isGreaterThan: lowerLimit).whereField("start", isLessThan: upperLimit)
print("1. zones Query has been defined")
//pass zonesQuery query to getZoneMarkers function to retrieve the zone markers from Firestore
getZoneMarkers(zonesQuery)
func getZoneMarkers(_ zonesQuery: (Query)) {
print("2. Entered getZoneMarkers function")
zoneMarkerArray.removeAll()
zonesQuery.getDocuments(completion: { (snapshot, error) in
if let error = error {
print("Error getting zone markers: \(error)")
return
}
guard let docs = snapshot?.documents else { return }
print("3. Successfully Retrieved the zone markers")
for document in docs {
self.zoneMarkerArray.append(document["start"]! as! Double)
print("4. Looping over zone marker results")
}
self.completion(zoneMarkerArray: self.zoneMarkerArray)
})
}
func completion(zoneMarkerArray: [Double]) {
print("5. Looping now completed. Result was \(zoneMarkerArray)")
}