Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift3 Swift 3:Alamorefire区块用户界面_Swift3_Closures_Alamofire - Fatal编程技术网

Swift3 Swift 3:Alamorefire区块用户界面

Swift3 Swift 3:Alamorefire区块用户界面,swift3,closures,alamofire,Swift3,Closures,Alamofire,我有一个APIManager singleton类,并且有一个从服务器获取数据的函数,如下所示: func scanOrder(order: String, completion:@escaping Handler){ let url = K.API_URL + "/api/containers/picking/" + order Alamofire.request(url, method: .get, parameters: nil, encoding: URLEncodin

我有一个APIManager singleton类,并且有一个从服务器获取数据的函数,如下所示:

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
        ...
    }
在等待服务器响应时,我的UI被阻止。我试图在DispatchQueue.global().async中包装alamofire请求调用,但它仍然会阻塞UI。

请帮忙

我从来没有像您那样将Alamofire.request与DispatchQueue.main.async一起使用过。原因是Alamofire与完成块组合使用时已经异步运行,不应该阻止UI,而UI是在主线程中解决的

你有没有试过这样的方法:

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)
        }
    }
}
电话:


显示更多的代码。你的
完成部分中有什么?apiMan.scanOrder(order:tfCode.text!){(response)in print(response)if response.result.issucess==true{let orderTmp=Mapper().map(JSON:response.result.value as!Dictionary)!as order if let msg=orderTmp.message{self.alert(message:msg)}else{self.order=orderTmp self.showOrderDetails()}else{self.alert(message:“Error”)}我编辑了我的答案,以显示我的完整代码。工作完美,没有冻结用户界面。也许问题不是Alamofire?
class CallingClass {
    func scanOrder(order:String){
        let manager = NetworkManager()
        var result: Any?

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