実用例
認証が必要なAPIを叩くとき、もし認証トークンが無効でAPIが失敗したらトークンを更新して再度APIを叩く、但し一定回数リトライしても認証トークンが無効となるようだったらリクエストを諦めてリクエスト失敗扱いにする
方法
- 特定のエラーが起きたら処理をやり直したい
-
retryWhen
使う
- ただしリトライは一定回数までにしたい
- 今何回目のエラーか判断できればいいので、
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)