这是一个非常好的问题。您的方法是完全有效的。但是,Alamofire实际上可以帮助您进一步简化此流程。
您的示例代码调度队列明细
在示例代码中,您将在以下调度队列之间跳转:
- NSURLSession分派队列
- TaskDelegate调度队列,用于验证和序列化程序处理
- 主调度队列,用于调用完成处理程序
- 用于JSON处理的高优先级队列
- 主调度队列以更新用户界面(如有必要)
如您所见,您到处都是。让我们看看利用Alamofire内部强大功能的另一种方法。
Alamofire响应调度队列
Alamofire在其自身的低级处理中内置了一种最佳方法。response
如果您选择使用该方法,则最终由所有自定义响应序列化程序调用的单个方法将支持自定义调度队列。
尽管GCD在调度队列之间跳转非常出色,但您要避免跳转到繁忙的队列(例如主线程)。通过消除异步处理过程中跳回主线程的方式,您可以大大加快处理速度。以下示例演示了如何直接使用Alamofire逻辑来执行此操作。
Alamofire 1.x
let queue = dispatch_queue_create("com.cnoon.manager-response-queue", DISPATCH_QUEUE_CONCURRENT)
let request = Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
request.response(
queue: queue,
serializer: Request.JSONResponseSerializer(options: .AllowFragments),
completionHandler: { _, _, JSON, _ in
println("Parsing JSON on thread: \(NSThread.currentThread()) is main thread: \(NSThread.isMainThread())")
println(JSON)
dispatch_async(dispatch_get_main_queue()) {
println("Am I back on the main thread: \(NSThread.isMainThread())")
}
}
)
Alamofire 3.x(Swift 2.2和2.3)
let queue = dispatch_queue_create("com.cnoon.manager-response-queue", DISPATCH_QUEUE_CONCURRENT)
let request = Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
request.response(
queue: queue,
responseSerializer: Request.JSONResponseSerializer(options: .AllowFragments),
completionHandler: { response in
print("Parsing JSON on thread: \(NSThread.currentThread()) is main thread: \(NSThread.isMainThread())")
print(response.result.value)
dispatch_async(dispatch_get_main_queue()) {
print("Am I back on the main thread: \(NSThread.isMainThread())")
}
}
)
Alamofire 4.x(Swift 3)
let queue = DispatchQueue(label: "com.cnoon.response-queue", qos: .utility, attributes: [.concurrent])
Alamofire.request("http://httpbin.org/get", parameters: ["foo": "bar"])
.response(
queue: queue,
responseSerializer: DataRequest.jsonResponseSerializer(),
completionHandler: { response in
print("Parsing JSON on thread: \(Thread.current) is main thread: \(Thread.isMainThread)")
print(response.result.value)
DispatchQueue.main.async {
print("Am I back on the main thread: \(Thread.isMainThread)")
}
}
)
Alamofire派遣队列明细
这是此方法涉及的不同调度队列的细分。
- NSURLSession分派队列
- TaskDelegate调度队列,用于验证和序列化程序处理
- 用于JSON处理的自定义管理器并发调度队列
- 主调度队列以更新用户界面(如有必要)
概要
通过消除返回主调度队列的第一跳,您消除了潜在的瓶颈,并使整个请求和处理成为异步。太棒了!
话虽如此,我对强调Alamofire真正工作原理的内在知识有多么重要。您永远不知道什么时候可以找到真正可以帮助您改进自己的代码的东西。
response
现在调用了该方法的第二个参数,responseSerializer
而不是serializer
(在Alamofire 3.0中)。那引起了一个Cannot call value of non-function type 'NSHTTPURLResponse?'
错误,让我有些困惑。