Swift3 Swift 3:Alamorefire区块用户界面
我有一个APIManager singleton类,并且有一个从服务器获取数据的函数,如下所示: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
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)
}
}