2016-12-28 2 views
1

EDIT: Я использую Swift 3.0 и 4.0 AlamofireSwift 3 - обработчик завершения не называется

В моей системе у меня есть список материалов, каждый материал содержит список пучков. Я пытаюсь запросить эти пакеты через webservice, а затем заполнить следующий вид (в этом примере я пытаюсь только распечатать полученные данные), но мой обработчик завершения не вызывается (ps: я новичок, и это первый раз я веду с асинхронной прогой). Любая идея почему?

Функция, выборки данных из WS является:

func fetchBundles(materialCode: String, completion: @escaping ([ProductsBundle]?) -> Void) { 
    var bundlesAdded = [ProductsBundle]() 
    let url = baseApiURL + "material-cavaletes/" + materialCode 
    print(url) 

    Alamofire.request(url, headers: headers).responseJSON { 
     response in 
     if let result = response.result.value { 
     var results = JSON(result)["results"] 

     for res in results { 
      bundlesAdded.append(self.getBundleFromJson(json: res)) 
     } 

     completion(bundlesAdded) 
     } 
    } 
    } 

И вызов функции, которая должна получить данные и обновить представление, является:

WebApi.sharedInstance.fetchBundles(materialCode: materialBeingListed.id, completion: { 
    (bundlesAdded: [ProductsBundle]?) in 
    guard let myBundles = bundlesAdded else { 
    print("erro") 
    return 
    } 

    print (myBundles) 
}) 

Я положил некоторую точку останова на и заметил, что строка «print (myBundles)» никогда не вызывается. Я понятия не имею, почему ... :(

+0

Вызывается ли какой-либо код внутри блока, переданный 'responseJSON'? Вы уверены, что конечная точка возвращает ответ JSON? – crizzis

+0

Если вы поставили точку останова перед' if let result = response.result.value' вы можете увидеть, возвращается ли Alamofire. Если да, попробуйте добавить 'print (« response: \ (response.response) »), чтобы увидеть, что он возвращается. Готов поспорить, проблема заключается в 'response.result.value' – Chris

ответ

0

Я думаю, вы могли бы обработки вашего запроса Alamofire неправильно Попробуйте это:.

Alamofire.request(url, headers: headers).responseJSON { 
    response in 
    switch response.result { 
     case .success(let data): 
     let json = JSON(data) 
     print("JSON: \(json)") 
     break 
     case .failure(let error): 
     print("Fetch failed :(error: \(error.localizedDescription)") 
     switch(error._code) { 
      case NSURLErrorTimedOut: 
      print("Timed Out") 
      default: 
      print(error._code) 
     } 
    } 
} 

После того, как вы видите, что данные JSON выглядит, как вы должны быть в состоянии получить доступ это правильно. Обычно JSON становится словарем, когда вы его несериализуете.

Смежные вопросы