RetryWhen 使用
平常主要用于对于网络请求失败之后的尝试
ex: 尝试5次 每次间隔3秒
代码:
import Foundation
import RxSwift
enum RetryError: Error {
case errorNumber
}
struct TestRetryWhen {
private static let bag = DisposeBag()
private static var retryCount = 1 // 当前重试次数
private static let maxRetryCount = 5 // 最多重试次数
private static let retryDelay: Double = 3 // 多少秒重试一次
static func test() {
let get5 = Single<Bool>.create(subscribe: { single in
if retryCount == maxRetryCount {
retryCount = 1
single(.success(true))
} else {
print("当前重试次数: ", retryCount)
retryCount += 1
single(.error(RetryError.errorNumber))
}
return Disposables.create()
})
get5.asObservable()
.observeOn(MainScheduler.asyncInstance)
.retryWhen { (error) -> Observable<Int> in
return error.flatMap({ (er) -> Observable<Int> in
guard retryCount < maxRetryCount+1 else {
return Observable.error(er)
}
return Observable.timer(retryDelay, scheduler: MainScheduler.instance)
})
}
.subscribe(onNext: { bool in
print("bool =", bool)
}, onError: { error in
switch (error as! RetryError) {
case .errorNumber:
print("number error")
}
}, onCompleted: {
print("completed")
})
.disposed(by: bag)
}
}
打印成功案例
当前重试次数: 1
当前重试次数: 2
当前重试次数: 3
当前重试次数: 4
bool = true
completed
(最后一次是成功的)
打印失败案例
当前重试次数: 1
当前重试次数: 2
当前重试次数: 3
当前重试次数: 4
number error
(最后一次是失败的)