[RxSwift]-エラー管理(Catch,Retry)


RxSWIFTがエラーを管理する方法は次のとおりです.
  • Catch
  • Retry
  • あります.
    1. Catch
    :エラーをデフォルト値(DefaultValue)に戻します.
    onError通知でシーケンスを復元します(エラーなし).

    Catch演算子は、ソース観測可能測定がonError通知を発行したときに使用されます.
    観察者に転送するのではなく、観察結果が正常に終了または終了することを保証するために、別のitemdlsk sequence itemとして切り取ります.
    public func `catch`(_ handler: @escaping (Error) throws -> RxSwift.Observable<Self.Element>) -> RxSwift.Observable<Self.Element>
    enum MyError: Error {
        case error1
        case error2
    }
    
    Observable.create {
        $0.onError(MyError.error1)
        return Disposables.create()
    }
    .catch { error in
        switch error as! MyError {
        case .error1:
            return .just("error1")
        case .error2:
            return .just("error2")
        }
    }
    .subscribe {
        print($0)
    }
    .disposed(by: disposeBag)
  • エラーが発生し、タイプがerror 1の場合、catchはエラーを受信し、justを使用して観察可能な<「error 1」>を返します.
  • //運転時出力:
    error1
    + CatchAndReturn
     public func catchAndReturn(_ element: Self.Element) -> RxSwift.Observable<Self.Element>
  • 要素:エラーが発生した場合、シーケンスの最後の
  • が観察されます.
    enum MyError: Error {
        case error1
        case error2
    }
    
    Observable.create {
        $0.onError(MyError.error1)
        return Disposables.create()
    }
    .catchAndReturn("error")
    .subscribe {
        print($0)
    }
    .disposed(by: disposeBag)
    
    エラータイプが
  • である場合にかかわらず、errorはnextイベントとして返されます.
  • //運転時出力:
    next(error)
    completed
    購読前にcatch AndReturnが行われていない場合
    Unhandled error happened: error1
    出力結果は以下の通りです.
    2. Retry
    :制限付きまたは無限の再試行.
    ソース観測量にエラーが発生した場合は、エラーなく完了(終了)するように再購読します.

    onError通知が表示されると、Retry演算子は、観察者に転送するのではなく、エラーなしでシーケンスを終了するために、ソースの観測可能な値を再購読し、再び機会を提供します.
    シーケンスはエラーによって終了しますが、Retryは観察者にonNextを送信し、重複データの解放を招く可能性があります.
    public func retry() -> RxSwift.Observable<Self.Element>

    再試行()演算子
  • を使用して、再試行を続行します.
  • したがって、再試行回数を制限するには、次のようにします.
  • 再試行(1000)だったので、1000回再試行しましたが、
  • ソース観測値はエラーを伝達し続けます.
    Unhandled error happened: error1
    出力します.