Swift
RxSwift

RxSwift:特定のエラーが起きたときに一定回数までその処理をやり直す

実用例

認証が必要なAPIを叩くとき、もし認証トークンが無効でAPIが失敗したらトークンを更新して再度APIを叩く、但し一定回数リトライしても認証トークンが無効となるようだったらリクエストを諦めてリクエスト失敗扱いにする

方法

  1. 特定のエラーが起きたら処理をやり直したい
    • retryWhen 使う
  2. ただしリトライは一定回数までにしたい
    • 今何回目のエラーか判断できればいいので、 enumerated で回数をつける

サンプルコード

リクエストの結果はSingleで受け取れる想定
成功するとsuccess、失敗するとerrorが流れてくる

requiredAuthRequest.post(with: parameters)    // 認証が必要なAPIを投げる
    .retryWhen { errorObservable in
        return errorObservable.enumerated()
            .flatMap { retryCount, error -> Single<Int> in
                // 自分のAPIサーバの固有エラーかチェックする
                guard let myApiError = error as? MyApiError else {
                    return .error( error)
                }
                guard myApiError.type == .invalidAuth else {
                    return .error( error)
                }

                // 一定回数以上失敗したらリトライしない
                guard retryCount < MyAuth.maxRetryCount else {
                    return .error( error)
                }

                // 認証トークンを更新する、これも結果はSingleで受け取れる想定
                return MyAuth.default.updateToken() 
            }
    }
    .subscribe( onSuccess: { [unowned self] result in
        self.doSomethingOnSuccess( with: result)
    }, onError: { [unowned self] error in
        self.handle( error)
    })
    .disposed(by: disposeBag)