Это функция, которая делает что-то в фоновом режиме и немедленно возвращает результат, а когда она завершает работу, вызывает ваш обработчик завершения.
Поэтому вполне естественно, что эта функция напрямую переходит к return finaleNbOfRowsInProductsListPage
.
Ваше решение состоит в том, что функция не должна возвращать значение, но она должна принять обработчик завершения и вызывать его после завершения.Это стиль передачи продолжения .
func getFullProductsJson(url: String, tag1: String, completion: @escaping (Int?, Error?) -> ()) {
Alamofire.request(url, method: .get).responseJSON {
response in
...
// When you are done
completion(finaleNbOfRowsInProductsListPage, nil)
}
}
Также обратите внимание, чтобы попытаться избежать установки большого количества переменных, попытаться сделать все параметром или возвращаемым значением из функции, этолегче отлаживать.Например, попробуйте сделать список как параметр, который передается в обработчик завершения, а не как переменную-член вашего контроллера представления, сделайте эту переменную-член только для списка, который готов к отображению.
func getFullProductsJson(url: String, tag1: String, completion: @escaping (Products?, Error?) -> ()) {
Alamofire.request(url, method: .get).responseJSON {
response in
...
// When you are done
completion(products, nil)
}
}
var products: [Product] = []
func refreshData() {
getFullProductsJson(url: "YOUR_URL_HERE", tag1: "TAG") {
// Try to use [weak self], also, read about Automatic Reference Counting
productsNullable, error in
if let products = productsNullable {
// Alamofire calls your callback on a background thread
// So you must return to the main thread first when you want
// to pass the result to any UI component.
DispatchQueue.main.async {
self?.products = products
self?.tableView.reloadData()
}
}
}
}