Попробуйте войти и выйти из группы отправки, находящейся в одной и той же Queue
let group = DispatchGroup()
DispatchQueue.global().async {
group.enter()
docRef.getDocument { (document, error) in
if let document = document, document.exists {
print("Document data: \(document.data() ?? ["key":"__data__"])")
itemData = document.data()
} else {
print("Document does not exist")
}
group.leave()
}
}
group.wait()
print("ITEM_DATA: \(itemData)")
Если вам интересно, что я изменил в вашем методе?
Посмотрите на оператор ввода, перемещающийся внутри DispatchQueue
асинхронное закрытие
Что может быть причиной проблемы?
Вхождение группы отправки в другую очередь и выход из отправкигруппа, находясь в другой очереди, может вызывать проблему
РЕДАКТИРОВАТЬ 1:
Эй, просто проверил ваш код и заставил его работать
let group = DispatchGroup()
DispatchQueue.global().async {
group.enter()
sleep(10)
debugPrint("Hello")
group.leave()
}
group.notify(queue: DispatchQueue.main) {
print("ITEM_DATA: )")
}
Вот последовательность вывода из консоли
- "Привет"
- ITEM_DATA:)
Я знаю, что не использую wait()
и wait()
также должен работать, но немного занят своей работой, поэтому не могу сейчас тестировать с ожиданием
РЕДАКТИРОВАТЬ 2:
Просто понял, что OP намереваетсявернуть значение из асинхронной функции, используя Dispatch group
, следовательно, обновив мой ответ для того же
Вы не можете получить возвратутверждение от асинхронного вызова независимо от того, какую логику вы применяете.Группа рассылки вам здесь не поможет, все что вам нужно здесь это closure
или block
func test(onCompletion completion: @escaping ([String:Any]) -> ()) {
DispatchQueue.global().async {
docRef.getDocument { (document, error) in
if let document = document, document.exists {
completion(document.data())
}
}
}
}
И называйте это как
self.test {[weak self] (data) in
debugPrint(data)
}
Надеюсь, это поможет