Поскольку fetchJSON
возвращается немедленно, до загрузки JSON.В результате DispatchGroup
вводится и сразу же остается без ожидания JSON:
group.enter()
self.fetchJSON() // returns immediately
group.leave() // the JSON has yet to be downloaded
Чтобы дождаться прибытия JSON, добавьте обработчик завершения в fetchJSON
:
override func viewDidLoad() {
group.enter()
self.fetchJSON {
group.notify(queue: .main) {
print("JSON call finished")
}
group.leave()
}
}
// Change the data type of the completion handler accordingly
func fetchJSON(completionHandler: @escaping (Data?) -> Void) {
// ...
networkService.downloadJSONasync(searchItem: AppConstants.appString.startString) { fetchedData in
defer { completionHandler(fetchedData) }
// ...
}
)
Использование defer
гарантирует, что обработчик завершения будет вызываться всегда, независимо от того, как возвращается внешнее замыкание.Мне непонятно, почему вы используете DispatchGroup
здесь, так как ждать не приходится, но я оставил его на месте, чтобы ответить на ваш вопрос.