LoginSignup
9
7

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-06-13

実用例

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

方法

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

サンプルコード

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

APIWithTokenSample.swift
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)
9
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
7