2017-01-10 2 views
0

У меня есть APIManager класс одноплодной и имеют функцию, чтобы получить данные с сервера, как это:Swift 3: Alamorefire блок UI

func scanOrder(order: String, completion:@escaping Handler){ 
    let url = K.API_URL + "/api/containers/picking/" + order 

    Alamofire.request(url, method: .get, parameters: nil, encoding: URLEncoding.default, headers: getHeader()).responseJSON { (response) in 
     DispatchQueue.main.async { 
      completion(response) 
     } 
    } 
} 

и я называю эту функцию в другом классе, как это:

apiMan.scanOrder(order: tfCode.text!) { (response) in 
     ... 
    } 

, ожидая ответа сервера, мой пользовательский интерфейс заблокирован. Я попытался включить вызов запроса alamofire в DispatchQueue.global(). Async, но он все еще блокирует пользовательский интерфейс.
Пожалуйста, помогите!

+1

Показать больше кода. Что находится внутри вашего «завершения»? – Sulthan

+0

apiMan.scanOrder (порядок: tfCode.text) {(ответ) в печати (ответ) если response.result.isSuccess == истинный { пусть orderTmp = Mapper () .map (JSON: response.result. значение как! Словарь)! как порядок , если пусть тзд = orderTmp.message { self.alert (сообщение: MSG) } еще { self.order = orderTmp self.showOrderDetails() } } еще { self.alert (сообщение: " Ошибка ") } } –

ответ

0

Я никогда не использовал Alamofire.request с DispatchQueue.main.async, как вы. Причина в том, что Alamofire в сочетании с блоками завершения уже работает async и не должен блокировать пользовательский интерфейс, который разрешен в главной теме.

Вы пробовали что-то вроде:

class NetworkManager { 

    func scanOrder(order: String, completion:@escaping (Any?) -> Void){ 
     let url = "https://example.com/api/containers/picking/" + order 

     Alamofire.request(url, method: .get, parameters: nil, encoding: URLEncoding.default, headers: AppConfiguration.sharedInstance.defaultHeader()) 
      .responseJSON { response in 
       guard response.result.isSuccess else { 
        Log.info("Error while fetching: \(response.result.error)") 
        completion(nil) 
        return 
       } 

       guard let responseJSON = response.result.value as? [String: AnyObject] else { 
        Log.info("Invalid information received from service") 
        completion(nil) 
        return 
       } 
       completion(responseJSON) 
     } 
    } 
} 

вызовов:

class CallingClass { 
    func scanOrder(order:String){ 
     let manager = NetworkManager() 
     var result: Any? 

     manager.scanOrder(order: "example") { response in 
      result = response 
     } 
     print(result as Any) 
    } 
} 
+0

Я пробовал это, но он все еще блокирует пользовательский интерфейс –

+0

Я отредактировал свой ответ, чтобы показать полный код. Работает отлично и не замораживает пользовательский интерфейс. Может быть, проблема не в Alamofire? –

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