From 0348ba613efb922ca2a5d96ea5d26b9a5321d42a Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Thu, 29 Dec 2016 20:03:43 +0300 Subject: [PATCH 1/3] subscribe mapping on background queue --- .../AlamofireManager+Extensions.swift | 2 -- .../AlamofireRequest+Extensions.swift | 30 ++++++++++++------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/LeadKit/LeadKit/Extensions/Alamofire/AlamofireManager+Extensions.swift b/LeadKit/LeadKit/Extensions/Alamofire/AlamofireManager+Extensions.swift index f48d09bb..f44856a3 100644 --- a/LeadKit/LeadKit/Extensions/Alamofire/AlamofireManager+Extensions.swift +++ b/LeadKit/LeadKit/Extensions/Alamofire/AlamofireManager+Extensions.swift @@ -31,7 +31,6 @@ public extension Reactive where Base: Alamofire.SessionManager { /// - Returns: Observable with HTTP URL Response and target object func responseModel(requestParameters: ApiRequestParameters) -> Observable<(HTTPURLResponse, T)> { return apiRequest(requestParameters: requestParameters) - .observeOn(ConcurrentDispatchQueueScheduler(qos: .userInitiated)) .flatMap { $0.rx.apiResponse() } } @@ -43,7 +42,6 @@ public extension Reactive where Base: Alamofire.SessionManager { Observable<(HTTPURLResponse, T)> where T.ModelType == T { return apiRequest(requestParameters: requestParameters) - .observeOn(ConcurrentDispatchQueueScheduler(qos: .userInitiated)) .flatMap { $0.rx.apiResponse() } } diff --git a/LeadKit/LeadKit/Extensions/Alamofire/AlamofireRequest+Extensions.swift b/LeadKit/LeadKit/Extensions/Alamofire/AlamofireRequest+Extensions.swift index cf33202d..3477163d 100644 --- a/LeadKit/LeadKit/Extensions/Alamofire/AlamofireRequest+Extensions.swift +++ b/LeadKit/LeadKit/Extensions/Alamofire/AlamofireRequest+Extensions.swift @@ -15,25 +15,33 @@ public extension Reactive where Base: DataRequest { /// Method which serializes response into target object /// + /// - Parameter mappingQueueQoS: QoS of underlying scheduler queue on which mapping will be executed /// - Returns: Observable with HTTP URL Response and target object - func apiResponse() -> Observable<(HTTPURLResponse, T)> { - return responseJSON().map { resp, value in - let json = try cast(value) as [String: Any] + func apiResponse(mappingQueueQoS: DispatchQoS = .default) -> Observable<(HTTPURLResponse, T)> { + return responseJSON() + .map { resp, value in + let json = try cast(value) as [String: Any] - return (resp, try T(JSON: json)) - } + return (resp, try T(JSON: json)) + } + .subscribeOn(ConcurrentDispatchQueueScheduler(qos: mappingQueueQoS)) } /// Method which serializes response into target object /// + /// - Parameter mappingQueueQoS: QoS of underlying scheduler queue on which mapping will be executed /// - Returns: Observable with HTTP URL Response and target object - func apiResponse() -> Observable<(HTTPURLResponse, T)> where T.ModelType == T { - return responseJSON().flatMap { resp, value -> Observable<(HTTPURLResponse, T)> in - let json = try cast(value) as [String: Any] + func apiResponse(mappingQueueQoS: DispatchQoS = .default) -> Observable<(HTTPURLResponse, T)> + where T.ModelType == T { - return T.createFrom(map: Map(mappingType: .fromJSON, JSON: json)) - .map { (resp, $0) } - } + return responseJSON() + .flatMap { resp, value -> Observable<(HTTPURLResponse, T)> in + let json = try cast(value) as [String: Any] + + return T.createFrom(map: Map(mappingType: .fromJSON, JSON: json)) + .map { (resp, $0) } + .subscribeOn(ConcurrentDispatchQueueScheduler(qos: mappingQueueQoS)) + } } } From b129eee4832d56ce666c324fc66a4f153ae49ee0 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Fri, 30 Dec 2016 08:24:59 +0300 Subject: [PATCH 2/3] mapping queue --- .../AlamofireManager+Extensions.swift | 14 +++++++----- .../AlamofireRequest+Extensions.swift | 22 +++++++++++-------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/LeadKit/LeadKit/Extensions/Alamofire/AlamofireManager+Extensions.swift b/LeadKit/LeadKit/Extensions/Alamofire/AlamofireManager+Extensions.swift index f44856a3..0dadeb93 100644 --- a/LeadKit/LeadKit/Extensions/Alamofire/AlamofireManager+Extensions.swift +++ b/LeadKit/LeadKit/Extensions/Alamofire/AlamofireManager+Extensions.swift @@ -28,21 +28,25 @@ public extension Reactive where Base: Alamofire.SessionManager { /// Method which executes request and serializes response into target object /// /// - Parameter requestParameters: api parameters to pass Alamofire + /// - Parameter mappingQueue: The dispatch queue to use for mapping /// - Returns: Observable with HTTP URL Response and target object - func responseModel(requestParameters: ApiRequestParameters) -> Observable<(HTTPURLResponse, T)> { + func responseModel(requestParameters: ApiRequestParameters, + mappingQueue: DispatchQueue = DispatchQueue.global()) -> Observable<(HTTPURLResponse, T)> { return apiRequest(requestParameters: requestParameters) - .flatMap { $0.rx.apiResponse() } + .flatMap { $0.rx.apiResponse(mappingQueue: mappingQueue) } } /// Method which executes request and serializes response into target object /// /// - Parameter requestParameters: api parameters to pass Alamofire + /// - Parameter mappingQueue: The dispatch queue to use for mapping /// - Returns: Observable with HTTP URL Response and target object - func responseObservableModel(requestParameters: ApiRequestParameters) -> - Observable<(HTTPURLResponse, T)> where T.ModelType == T { + func responseObservableModel(requestParameters: ApiRequestParameters, + mappingQueue: DispatchQueue = DispatchQueue.global()) -> Observable<(HTTPURLResponse, T)> + where T.ModelType == T { return apiRequest(requestParameters: requestParameters) - .flatMap { $0.rx.apiResponse() } + .flatMap { $0.rx.apiResponse(mappingQueue: mappingQueue) } } } diff --git a/LeadKit/LeadKit/Extensions/Alamofire/AlamofireRequest+Extensions.swift b/LeadKit/LeadKit/Extensions/Alamofire/AlamofireRequest+Extensions.swift index 3477163d..1b1035f0 100644 --- a/LeadKit/LeadKit/Extensions/Alamofire/AlamofireRequest+Extensions.swift +++ b/LeadKit/LeadKit/Extensions/Alamofire/AlamofireRequest+Extensions.swift @@ -15,33 +15,37 @@ public extension Reactive where Base: DataRequest { /// Method which serializes response into target object /// - /// - Parameter mappingQueueQoS: QoS of underlying scheduler queue on which mapping will be executed + /// - Parameter mappingQueue: The dispatch queue to use for mapping /// - Returns: Observable with HTTP URL Response and target object - func apiResponse(mappingQueueQoS: DispatchQoS = .default) -> Observable<(HTTPURLResponse, T)> { - return responseJSON() + func apiResponse(mappingQueue: DispatchQueue = DispatchQueue.global()) + -> Observable<(HTTPURLResponse, T)> { + + return responseJSONOnQueue(mappingQueue) .map { resp, value in let json = try cast(value) as [String: Any] return (resp, try T(JSON: json)) } - .subscribeOn(ConcurrentDispatchQueueScheduler(qos: mappingQueueQoS)) } /// Method which serializes response into target object /// - /// - Parameter mappingQueueQoS: QoS of underlying scheduler queue on which mapping will be executed + /// - Parameter mappingQueue: The dispatch queue to use /// - Returns: Observable with HTTP URL Response and target object - func apiResponse(mappingQueueQoS: DispatchQoS = .default) -> Observable<(HTTPURLResponse, T)> - where T.ModelType == T { + func apiResponse(mappingQueue: DispatchQueue = DispatchQueue.global()) + -> Observable<(HTTPURLResponse, T)> where T.ModelType == T { - return responseJSON() + return responseJSONOnQueue(mappingQueue) .flatMap { resp, value -> Observable<(HTTPURLResponse, T)> in let json = try cast(value) as [String: Any] return T.createFrom(map: Map(mappingType: .fromJSON, JSON: json)) .map { (resp, $0) } - .subscribeOn(ConcurrentDispatchQueueScheduler(qos: mappingQueueQoS)) } } + internal func responseJSONOnQueue(_ queue: DispatchQueue) -> Observable<(HTTPURLResponse, Any)> { + return responseResult(queue: queue, responseSerializer: DataRequest.jsonResponseSerializer(options: .allowFragments)) + } + } From 0416b5d97955d1a3447852966066cd977c536333 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Fri, 30 Dec 2016 15:08:01 +0300 Subject: [PATCH 3/3] commnet fix --- .../Extensions/Alamofire/AlamofireRequest+Extensions.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LeadKit/LeadKit/Extensions/Alamofire/AlamofireRequest+Extensions.swift b/LeadKit/LeadKit/Extensions/Alamofire/AlamofireRequest+Extensions.swift index 1b1035f0..a6cfe6ef 100644 --- a/LeadKit/LeadKit/Extensions/Alamofire/AlamofireRequest+Extensions.swift +++ b/LeadKit/LeadKit/Extensions/Alamofire/AlamofireRequest+Extensions.swift @@ -30,7 +30,7 @@ public extension Reactive where Base: DataRequest { /// Method which serializes response into target object /// - /// - Parameter mappingQueue: The dispatch queue to use + /// - Parameter mappingQueue: The dispatch queue to use for mapping /// - Returns: Observable with HTTP URL Response and target object func apiResponse(mappingQueue: DispatchQueue = DispatchQueue.global()) -> Observable<(HTTPURLResponse, T)> where T.ModelType == T {