美文网首页Swift编程
RxSwift RetryWhen使用

RxSwift RetryWhen使用

作者: Hellolad | 来源:发表于2018-03-20 16:23 被阅读19次
RetryWhen 使用

补录上次发布的RxSwift (retry, catchErrorJustReturn)用法

平常主要用于对于网络请求失败之后的尝试
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
(最后一次是失败的)

相关文章

网友评论

    本文标题:RxSwift RetryWhen使用

    本文链接:https://www.haomeiwen.com/subject/syigzxtx.html