SJC*_*her 16 multithreading ios swift alamofire
据我所知,默认情况下,Alamofire请求在后台线程中运行.
当我尝试运行此代码时:
let productsEndPoint: String = "http://api.test.com/Products?username=testuser"
Alamofire.request(productsEndPoint, method: .get)
.responseJSON { response in
// check for errors
guard response.result.error == nil else {
// got an error in getting the data, need to handle it
print("Inside error guard")
print(response.result.error!)
return
}
// make sure we got some JSON since that's what we expect
guard let json = response.result.value as? [String: Any] else {
print("didn't get products as JSON from API")
print("Error: \(response.result.error)")
return
}
// get and print the title
guard let products = json["products"] as? [[String: Any]] else {
print("Could not get products from JSON")
return
}
print(products)
}
Run Code Online (Sandbox Code Playgroud)
在网络呼叫的所有项目都已完成打印之前,UI没有响应; 所以我尝试将GCD与Alamofire一起使用:
let queue = DispatchQueue(label: "com.test.api", qos: .background, attributes: .concurrent)
queue.async {
let productsEndPoint: String = "http://api.test.com/Products?username=testuser"
Alamofire.request(productsEndPoint, method: .get)
.responseJSON { response in
// check for errors
guard response.result.error == nil else {
// got an error in getting the data, need to handle it
print("Inside error guard")
print(response.result.error!)
return
}
// make sure we got some JSON since that's what we expect
guard let json = response.result.value as? [String: Any] else {
print("didn't get products as JSON from API")
print("Error: \(response.result.error)")
return
}
// get and print the title
guard let products = json["products"] as? [[String: Any]] else {
print("Could not get products from JSON")
return
}
print(products)
}
}
Run Code Online (Sandbox Code Playgroud)
用户界面仍然没有像以前那样反应迟钝.
我在这里做错了什么,或者Alamofire的错误是什么?
SJC*_*her 26
关于Alamofire默认运行在后台线程上我错了.它实际上默认在主队列上运行.我在Alamofire的Github页面上打开了一个问题,它已在这里解决:https://github.com/Alamofire/Alamofire/issues/1922
解决我的问题的正确方法是使用.responseJSON方法上的" queue "参数指定我希望运行请求的队列类型(
.responseJSON(queue: queue) { response in
...
}
Run Code Online (Sandbox Code Playgroud)
)
这是我的代码的完整更正版本:
let productsEndPoint: String = "http://api.test.com/Products?username=testuser"
let queue = DispatchQueue(label: "com.test.api", qos: .background, attributes: .concurrent)
Alamofire.request(productsEndPoint, method: .get)
.responseJSON(queue: queue) { response in
// check for errors
guard response.result.error == nil else {
// got an error in getting the data, need to handle it
print("Inside error guard")
print(response.result.error!)
return
}
// make sure we got some JSON since that's what we expect
guard let json = response.result.value as? [String: Any] else {
print("didn't get products as JSON from API")
print("Error: \(response.result.error)")
return
}
// get and print the title
guard let products = json["products"] as? [[String: Any]] else {
print("Could not get products from JSON")
return
}
print(products)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8121 次 |
| 最近记录: |