В моем приложении возникла небольшая проблема. Прежде чем вставлять какой-либо код, позвольте мне рассказать немного о контексте. У меня есть TableView с некоторыми динамическими ячейками. Каждая ячейка содержит кнопку. Когда я нажимаю кнопку внутри ячейки, вызывается функция, которая выполняет запрос задачи URLSession. Я использую класс Decodable для хранения результата JSON, и все, что я пытаюсь сделать, это распечатать счетчик массива результатов. Проблема у меня; печать происходит до того, как будет возвращен результат.
Чтобы решить эту проблему, я попытался использовать обработчик завершения и запустить URLSession внутри DispatchGroup и не печатать, пока DispatchGroup не закончится.
Я надеюсь, что кто-нибудь сможет быстро взглянуть на мой код и указать на мою ошибку.
Вот моя функция, в которой я делаю запрос URLSession:
func loadLocalPrice(selectedItemName: String, completion: @escaping (_ result: [PriceModel])-> Void) {
var localPrice = [PriceModel]()
let urlApi = "http://my.url.com/category/"+self.selectedCategory+"/"+selectedItemName
guard let url = URL(string: urlApi) else {return completion(localPrice)}
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else {return}
self.dispatchGroupLoadItems.enter()
do {
localPrice = try JSONDecoder().decode([PriceModel].self, from: data)
print("The result inside the function is: \(localPrice.count)")
} catch let JSONerror {
print("error decoding JSON", JSONerror)
}
self.dispatchGroupLoadItems.leave()
}.resume()
return completion(localPrice)
}
Вот функция, которая вызывает указанную выше функцию, содержащую URLSession:
func addToBasket(sender: UIButton, name: String?, category: String?) {
var localPrice = [PriceModel]()
DispatchQueue.main.async {
self.loadLocalPrice(selectedItemName: name!) {
(result: [PriceModel]) in
print("got back inside the dispatchGroup: \(result.count)")
localPrice = result
}
self.dispatchGroupLoadItems.notify(queue: .main) {
print("Got back outside the dispatchGroup: \(localPrice.count)")
}
}
}
Ниже приведен вывод моей консоли, чтобы вы могли видеть порядок, в котором возвращаются результаты:
got back inside the dispatchGroup: 0
Got back outside the dispatchGroup: 0
The result inside the function is: 1