From 3969199df782481b0d760d9cc11c1e082335a1ba Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Fri, 1 Dec 2017 14:47:43 +0300 Subject: [PATCH 1/6] pass acceptable status codes --- .../AlamofireManager+Extensions.swift | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/Sources/Extensions/Alamofire/AlamofireManager+Extensions.swift b/Sources/Extensions/Alamofire/AlamofireManager+Extensions.swift index d308eef2..48f3a51e 100644 --- a/Sources/Extensions/Alamofire/AlamofireManager+Extensions.swift +++ b/Sources/Extensions/Alamofire/AlamofireManager+Extensions.swift @@ -25,18 +25,29 @@ import RxSwift import RxAlamofire import ObjectMapper +public extension Alamofire.SessionManager { + + /// The default acceptable range 200...299 + static let defaultAcceptableStatusCodes = Array(200..<300) + +} + public extension Reactive where Base: Alamofire.SessionManager { /// Method which executes request with given api parameters /// /// - Parameter requestParameters: api parameters to pass Alamofire /// - Returns: Observable with request - func apiRequest(requestParameters: ApiRequestParameters) -> Observable { + func apiRequest(requestParameters: ApiRequestParameters, + acceptableStatusCodes: [Int] = Base.defaultAcceptableStatusCodes) + -> Observable { + return request(requestParameters.method, requestParameters.url, parameters: requestParameters.parameters, encoding: requestParameters.encoding, headers: requestParameters.headers) + .map { $0.validate(statusCode: acceptableStatusCodes) } } /// Method which executes request and serializes response into target object @@ -45,11 +56,12 @@ public extension Reactive where Base: Alamofire.SessionManager { /// - Parameter mappingQueue: The dispatch queue to use for mapping /// - Returns: Observable with HTTP URL Response and target object func responseModel(requestParameters: ApiRequestParameters, - mappingQueue: DispatchQueue = .global()) + mappingQueue: DispatchQueue = .global(), + acceptableStatusCodes: [Int] = Base.defaultAcceptableStatusCodes) -> Observable<(response: HTTPURLResponse, model: T)> { - return apiRequest(requestParameters: requestParameters) - .flatMap { $0.validate().rx.apiResponse(mappingQueue: mappingQueue) } + return apiRequest(requestParameters: requestParameters, acceptableStatusCodes: acceptableStatusCodes) + .flatMap { $0.rx.apiResponse(mappingQueue: mappingQueue) } } /// Method which executes request and serializes response into array of target objects @@ -58,11 +70,12 @@ public extension Reactive where Base: Alamofire.SessionManager { /// - Parameter mappingQueue: The dispatch queue to use for mapping /// - Returns: Observable with HTTP URL Response and array of target objects func responseModel(requestParameters: ApiRequestParameters, - mappingQueue: DispatchQueue = .global()) + mappingQueue: DispatchQueue = .global(), + acceptableStatusCodes: [Int] = Base.defaultAcceptableStatusCodes) -> Observable<(response: HTTPURLResponse, models: [T])> { - return apiRequest(requestParameters: requestParameters) - .flatMap { $0.validate().rx.apiResponse(mappingQueue: mappingQueue) } + return apiRequest(requestParameters: requestParameters, acceptableStatusCodes: acceptableStatusCodes) + .flatMap { $0.rx.apiResponse(mappingQueue: mappingQueue) } } /// Method which executes request and serializes response into target object @@ -71,11 +84,12 @@ public extension Reactive where Base: Alamofire.SessionManager { /// - Parameter mappingQueue: The dispatch queue to use for mapping /// - Returns: Observable with HTTP URL Response and target object func responseObservableModel(requestParameters: ApiRequestParameters, - mappingQueue: DispatchQueue = .global()) + mappingQueue: DispatchQueue = .global(), + acceptableStatusCodes: [Int] = Base.defaultAcceptableStatusCodes) -> Observable<(response: HTTPURLResponse, model: T)> where T.ModelType == T { return apiRequest(requestParameters: requestParameters) - .flatMap { $0.validate().rx.observableApiResponse(mappingQueue: mappingQueue) } + .flatMap { $0.rx.observableApiResponse(mappingQueue: mappingQueue) } } /// Method which executes request and serializes response into array of target objects @@ -84,11 +98,12 @@ public extension Reactive where Base: Alamofire.SessionManager { /// - Parameter mappingQueue: The dispatch queue to use for mapping /// - Returns: Observable with HTTP URL Response and array of target objects func responseObservableModel(requestParameters: ApiRequestParameters, - mappingQueue: DispatchQueue = .global()) + mappingQueue: DispatchQueue = .global(), + acceptableStatusCodes: [Int] = Base.defaultAcceptableStatusCodes) -> Observable<(response: HTTPURLResponse, models: [T])> where T.ModelType == T { - return apiRequest(requestParameters: requestParameters) - .flatMap { $0.validate().rx.observableApiResponse(mappingQueue: mappingQueue) } + return apiRequest(requestParameters: requestParameters, acceptableStatusCodes: acceptableStatusCodes) + .flatMap { $0.rx.observableApiResponse(mappingQueue: mappingQueue) } } } From 7c92ef47e0874b7843184cceedba6998927291f1 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Fri, 1 Dec 2017 15:11:38 +0300 Subject: [PATCH 2/6] fix crash when NetworkService creates lazy in background thread (globalinit_*_func0) --- .../NetworkService+ActivityIndicator.swift | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Sources/Extensions/NetworkService/NetworkService+ActivityIndicator.swift b/Sources/Extensions/NetworkService/NetworkService+ActivityIndicator.swift index 85ee1827..1dc7d6be 100644 --- a/Sources/Extensions/NetworkService/NetworkService+ActivityIndicator.swift +++ b/Sources/Extensions/NetworkService/NetworkService+ActivityIndicator.swift @@ -26,9 +26,12 @@ extension NetworkService { /// Let netwrok service automatically show / hide activity indicator public func bindActivityIndicator() -> Disposable { - return requestCount - .map { $0 != 0 } - .drive(UIApplication.shared.rx.isNetworkActivityIndicatorVisible) + // Fatal error: `drive*` family of methods can be only called from `MainThread` + return DispatchQueue.main.sync { + requestCount + .map { $0 != 0 } + .drive(UIApplication.shared.rx.isNetworkActivityIndicatorVisible) + } } } From c8403eb6390ec765fbad149c6822bf94f2322348 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Fri, 1 Dec 2017 15:28:44 +0300 Subject: [PATCH 3/6] add acceptable status codes to network service constructor --- Sources/Classes/Services/NetworkService.swift | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Sources/Classes/Services/NetworkService.swift b/Sources/Classes/Services/NetworkService.swift index ad89b7b8..7811c4e5 100644 --- a/Sources/Classes/Services/NetworkService.swift +++ b/Sources/Classes/Services/NetworkService.swift @@ -37,6 +37,8 @@ open class NetworkService { public let sessionManager: Alamofire.SessionManager + private let acceptableStatusCodes: [Int] + var requestCount: Driver { return requestCountVariable.asDriver() } @@ -44,8 +46,11 @@ open class NetworkService { /// Creates new instance of NetworkService with given Alamofire session manager /// /// - Parameter sessionManager: Alamofire.SessionManager to use for requests - public init(sessionManager: Alamofire.SessionManager) { + public init(sessionManager: Alamofire.SessionManager, + acceptableStatusCodes: [Int] = Alamofire.SessionManager.defaultAcceptableStatusCodes) { + self.sessionManager = sessionManager + self.acceptableStatusCodes = acceptableStatusCodes } /// Perform reactive request to get mapped ObservableMappable model and http response @@ -55,7 +60,8 @@ open class NetworkService { public func rxRequest(with parameters: ApiRequestParameters) -> Observable<(response: HTTPURLResponse, model: T)> where T.ModelType == T { - return sessionManager.rx.responseObservableModel(requestParameters: parameters) + return sessionManager.rx.responseObservableModel(requestParameters: parameters, + acceptableStatusCodes: acceptableStatusCodes) .counterTracking(for: self) } @@ -66,7 +72,8 @@ open class NetworkService { public func rxRequest(with parameters: ApiRequestParameters) -> Observable<(response: HTTPURLResponse, model: T)> { - return sessionManager.rx.responseModel(requestParameters: parameters) + return sessionManager.rx.responseModel(requestParameters: parameters, + acceptableStatusCodes: acceptableStatusCodes) .counterTracking(for: self) } From 7a12073d59f4d5dbe7fe29b4800836179f5e3da0 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Fri, 1 Dec 2017 15:53:44 +0300 Subject: [PATCH 4/6] Revert "fix crash when NetworkService creates lazy in background thread (globalinit_*_func0)" This reverts commit 7c92ef47e0874b7843184cceedba6998927291f1. --- .../NetworkService+ActivityIndicator.swift | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/Sources/Extensions/NetworkService/NetworkService+ActivityIndicator.swift b/Sources/Extensions/NetworkService/NetworkService+ActivityIndicator.swift index 1dc7d6be..85ee1827 100644 --- a/Sources/Extensions/NetworkService/NetworkService+ActivityIndicator.swift +++ b/Sources/Extensions/NetworkService/NetworkService+ActivityIndicator.swift @@ -26,12 +26,9 @@ extension NetworkService { /// Let netwrok service automatically show / hide activity indicator public func bindActivityIndicator() -> Disposable { - // Fatal error: `drive*` family of methods can be only called from `MainThread` - return DispatchQueue.main.sync { - requestCount - .map { $0 != 0 } - .drive(UIApplication.shared.rx.isNetworkActivityIndicatorVisible) - } + return requestCount + .map { $0 != 0 } + .drive(UIApplication.shared.rx.isNetworkActivityIndicatorVisible) } } From 4bd37795358074ce52827f13ce19358477d28dce Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Fri, 1 Dec 2017 16:19:49 +0300 Subject: [PATCH 5/6] update change log and podspec --- CHANGELOG.md | 4 ++++ LeadKit.podspec | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba178a87..dcba36fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +### 0.6.5 + +- **Add**: Ability to handle responses with non-default status codes. + ### 0.6.4 - **Fix**: SpinnerView bug(no animation) in Swift 4. diff --git a/LeadKit.podspec b/LeadKit.podspec index 19f7883d..8db51ad6 100644 --- a/LeadKit.podspec +++ b/LeadKit.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "LeadKit" - s.version = "0.6.4" + s.version = "0.6.5" s.summary = "iOS framework with a bunch of tools for rapid development" s.homepage = "https://github.com/TouchInstinct/LeadKit" s.license = "Apache License, Version 2.0" From dff3edfc8f686eaf71561aab0fcef57c5b938c91 Mon Sep 17 00:00:00 2001 From: Ivan Smolin Date: Fri, 1 Dec 2017 16:38:51 +0300 Subject: [PATCH 6/6] forgot to pass function param --- Sources/Extensions/Alamofire/AlamofireManager+Extensions.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Extensions/Alamofire/AlamofireManager+Extensions.swift b/Sources/Extensions/Alamofire/AlamofireManager+Extensions.swift index 48f3a51e..9c010ba0 100644 --- a/Sources/Extensions/Alamofire/AlamofireManager+Extensions.swift +++ b/Sources/Extensions/Alamofire/AlamofireManager+Extensions.swift @@ -88,7 +88,7 @@ public extension Reactive where Base: Alamofire.SessionManager { acceptableStatusCodes: [Int] = Base.defaultAcceptableStatusCodes) -> Observable<(response: HTTPURLResponse, model: T)> where T.ModelType == T { - return apiRequest(requestParameters: requestParameters) + return apiRequest(requestParameters: requestParameters, acceptableStatusCodes: acceptableStatusCodes) .flatMap { $0.rx.observableApiResponse(mappingQueue: mappingQueue) } }