diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a4af68..efa47ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## 0.1.1 +- **Add**: `acceptableStatusCodes` property in `DefaultNetworkService`. +- **Add**: `retry(retryLimit:canRetryClosure:)` to `Observable` extension. +- **Removed**: `retryWithinErrors` method from `Observable` extension. - **Update**: LeadKit to `0.6.x` version - **Removed**: `ConnectionError`. (Replaced by `LeadKit.RequestError`) - **Removed**: `handleConnectionErrors` from Observable+Extensions diff --git a/LeadKitAdditions/Podfile.lock b/LeadKitAdditions/Podfile.lock index fe4bf4e..4c2a1b4 100644 --- a/LeadKitAdditions/Podfile.lock +++ b/LeadKitAdditions/Podfile.lock @@ -6,9 +6,9 @@ PODS: - IDZSwiftCommonCrypto (0.10.0) - InputMask (3.0.0) - KeychainAccess (3.1.0) - - LeadKit (0.6.1): - - LeadKit/Core (= 0.6.1) - - LeadKit/Core (0.6.1): + - LeadKit (0.6.5): + - LeadKit/Core (= 0.6.5) + - LeadKit/Core (0.6.5): - CocoaLumberjack/Swift (~> 3.3.0) - ObjectMapper (~> 3.0.0) - RxAlamofire (= 4.0.0) @@ -16,7 +16,7 @@ PODS: - RxSwift (= 4.0.0) - TableKit (~> 2.5.0) - UIScrollView-InfiniteScroll (~> 1.0.0) - - LeadKit/Core-iOS-Extension (0.6.1): + - LeadKit/Core-iOS-Extension (0.6.5): - CocoaLumberjack/Swift (~> 3.3.0) - ObjectMapper (~> 3.0.0) - RxAlamofire (= 4.0.0) @@ -49,7 +49,7 @@ SPEC CHECKSUMS: IDZSwiftCommonCrypto: 4eef2c46e262dfbcbc1fd76365e066336680ad7d InputMask: 37c273bde6705187d80cf0b4240cb42ea92096c3 KeychainAccess: 94c5540b32eabf7bc32bfb976a268e8ea05fd6da - LeadKit: 13d8e4d8f9484e9fd77b23da6f585eb67b1886c3 + LeadKit: 583c724f25852e40eebad8af5a945e101c282fde ObjectMapper: 92230db59bf8f341a5c3a3cf0b9fbdde3cf0d87f RxAlamofire: 6ea579ac53bf14cb4bc7049a3866e5a769989b1d RxCocoa: d62846ca96495d862fa4c59ea7d87e5031d7340e diff --git a/LeadKitAdditions/Sources/Extensions/Observable+Extensions.swift b/LeadKitAdditions/Sources/Extensions/Observable+Extensions.swift index 363fa48..c6dbe09 100644 --- a/LeadKitAdditions/Sources/Extensions/Observable+Extensions.swift +++ b/LeadKitAdditions/Sources/Extensions/Observable+Extensions.swift @@ -29,23 +29,23 @@ public typealias VoidBlock = () -> Void public extension Observable { - /** - Allow to configure request to restart if error occured - - - parameters: - - errorTypes: list of error types, which triggers request restart - - retryLimit: how many times request can restarts - */ - func retryWithinErrors(_ errorTypes: [Error.Type] = [RequestError.self], - retryLimit: UInt = DefaultNetworkService.retryLimit) - -> Observable { + /// A closure that checks for "retryable" error + typealias CanRetryClosure = (Error) -> Bool + + /// Allow to configure request to restart if error occured + /// + /// - Parameters: + /// - retryLimit: how many times request can restarts + /// - canRetryClosure: a closure that checks for "retryable" error + /// - Returns: An observable sequence producing the elements of the given sequence repeatedly + /// until it terminates successfully or is notified to error or complete. + func retry(retryLimit: UInt = DefaultNetworkService.retryLimit, + canRetryClosure: @escaping CanRetryClosure) -> Observable { return observeOn(CurrentThreadScheduler.instance) - .retryWhen { errors -> Observable in - return errors.enumerated().flatMap { attempt, error -> Observable in - let canRetry = errorTypes.contains { type(of: error) == $0 } - - return (canRetry && attempt < retryLimit - 1) ? self : .error(error) + .retryWhen { errorsObservable -> Observable in + return errorsObservable.enumerated().flatMap { + (canRetryClosure($1) && $0 < retryLimit - 1) ? self : .error($1) } } } diff --git a/LeadKitAdditions/Sources/Services/Network/DefaultNetworkService.swift b/LeadKitAdditions/Sources/Services/Network/DefaultNetworkService.swift index 64401ca..54d8c2f 100644 --- a/LeadKitAdditions/Sources/Services/Network/DefaultNetworkService.swift +++ b/LeadKitAdditions/Sources/Services/Network/DefaultNetworkService.swift @@ -43,8 +43,13 @@ open class DefaultNetworkService: NetworkService { return 20.0 } - public override init(sessionManager: SessionManager) { - super.init(sessionManager: sessionManager) + /// The default acceptable range 200…299 + open var acceptableStatusCodes: [Int] { + return Alamofire.SessionManager.defaultAcceptableStatusCodes + } + + public init(sessionManager: SessionManager) { + super.init(sessionManager: sessionManager, acceptableStatusCodes: acceptableStatusCodes) // Fatal error: `drive*` family of methods can be only called from `MainThread` DispatchQueue.main.async {