retry changes. add acceptable status codes to DefaultNetworkManager

This commit is contained in:
Ivan Smolin 2017-12-01 17:11:20 +03:00
parent 042fac89cc
commit e5aff4e1e9
4 changed files with 30 additions and 22 deletions

View File

@ -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

View File

@ -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

View File

@ -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<Observable.E> {
/// 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<Observable.E> {
return observeOn(CurrentThreadScheduler.instance)
.retryWhen { errors -> Observable<Observable.E> in
return errors.enumerated().flatMap { attempt, error -> Observable<Observable.E> in
let canRetry = errorTypes.contains { type(of: error) == $0 }
return (canRetry && attempt < retryLimit - 1) ? self : .error(error)
.retryWhen { errorsObservable -> Observable<Observable.E> in
return errorsObservable.enumerated().flatMap {
(canRetryClosure($1) && $0 < retryLimit - 1) ? self : .error($1)
}
}
}

View File

@ -43,8 +43,13 @@ open class DefaultNetworkService: NetworkService {
return 20.0
}
public override init(sessionManager: SessionManager) {
super.init(sessionManager: sessionManager)
/// The default acceptable range 200299
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 {