이것은 정말 좋은 질문입니다. 귀하의 접근 방식은 완벽하게 유효합니다. 그러나 Alamofire는 실제로이를 더욱 간소화하는 데 도움이 될 수 있습니다.
예제 코드 디스패치 대기열 분석
예제 코드에서 다음 디스패치 큐 사이를 점프합니다.
- NSURLSession 디스패치 큐
- 유효성 검사 및 직렬 변환기 처리를위한 TaskDelegate 디스패치 큐
- 완료 핸들러를 호출하기위한 기본 디스패치 큐
- JSON 처리를위한 높은 우선 순위 대기열
- 사용자 인터페이스를 업데이트하기위한 기본 디스패치 대기열 (필요한 경우)
보시다시피, 당신은 여기 저기 뛰어 다니고 있습니다. Alamofire 내부의 강력한 기능을 활용하는 대체 접근 방식을 살펴 보겠습니다.
Alamofire 응답 디스패치 대기열
Alamofire는 자체 저수준 처리에 최적의 접근 방식이 내장되어 있습니다. response
궁극적으로 모든 사용자 지정 응답 serializer에 의해 호출되는 단일 메서드는 사용하기로 선택한 경우 사용자 지정 디스패치 큐를 지원합니다.
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?'
나를 약간 혼란스럽게 만드는 오류를 일으켰습니다 .