Đây thực sự là một câu hỏi tốt. Cách tiếp cận của bạn là hoàn toàn hợp lệ. Tuy nhiên, Alamofire thực sự có thể giúp bạn hợp lý hóa việc này hơn nữa.
Phân tích hàng đợi công văn mã mẫu của bạn
Trong mã ví dụ của bạn, bạn đang nhảy giữa các hàng đợi gửi sau:
- Hàng đợi gửi NSURLSession
- Hàng đợi gửi TaskDelegate để xác thực và xử lý bộ tuần tự
- Hàng đợi công văn chính để gọi trình xử lý hoàn thành của bạn
- Hàng đợi ưu tiên cao để xử lý JSON
- Hàng đợi công văn chính để cập nhật giao diện người dùng (nếu cần)
Như bạn có thể thấy, bạn đang nhảy khắp nơi. Chúng ta hãy xem xét một phương pháp thay thế tận dụng một tính năng mạnh mẽ bên trong Alamofire.
Hàng đợi Công văn Phản hồi Alamofire
Alamofire có một cách tiếp cận tối ưu được tích hợp trong quá trình xử lý cấp thấp của riêng nó. response
Phương thức duy nhất cuối cùng được gọi bởi tất cả các trình tuần tự phản hồi tùy chỉnh có hỗ trợ cho hàng đợi điều phối tùy chỉnh nếu bạn chọn sử dụng nó.
Mặc dù GCD rất tuyệt vời trong việc nhảy giữa các hàng đợi gửi, nhưng bạn muốn tránh chuyển sang một hàng đang bận (ví dụ: luồng chính). Bằng cách loại bỏ bước quay trở lại luồng chính ở giữa quá trình xử lý không đồng bộ, bạn có thể tăng tốc mọi thứ lên đáng kể. Ví dụ sau đây trình bày cách thực hiện điều này bằng cách sử dụng logic Alamofire thẳng ra khỏi hộp.
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 và 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)")
}
}
)
Phân tích hàng đợi công văn Alamofire
Dưới đây là bảng phân tích các hàng đợi gửi khác nhau liên quan đến phương pháp này.
- Hàng đợi gửi NSURLSession
- Hàng đợi gửi TaskDelegate để xác thực và xử lý bộ tuần tự
- Hàng đợi gửi đồng thời của trình quản lý tùy chỉnh để xử lý JSON
- Hàng đợi công văn chính để cập nhật giao diện người dùng (nếu cần)
Tóm lược
Bằng cách loại bỏ bước đầu tiên quay trở lại hàng đợi gửi chính, bạn đã loại bỏ một nút thắt cổ chai tiềm ẩn cũng như bạn đã thực hiện toàn bộ yêu cầu và xử lý không đồng bộ của mình. Tuyệt vời!
Với điều đó đã nói, tôi không thể nhấn mạnh tầm quan trọng của việc làm quen với nội bộ về cách thức hoạt động thực sự của Alamofire. Bạn không bao giờ biết khi nào bạn có thể tìm thấy thứ gì đó thực sự có thể giúp bạn cải thiện mã của chính mình.
response
phương thức bây giờ được gọiresponseSerializer
chứ không phảiserializer
(trong Alamofire 3.0). Điều đó gây ra mộtCannot call value of non-function type 'NSHTTPURLResponse?'
lỗi khiến tôi bối rối một chút.