Created
May 10, 2017 20:33
-
-
Save daltonclaybrook/811450d6211d15e04d65f64b3a338e94 to your computer and use it in GitHub Desktop.
Retry with RxSwift
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| class AuthRetryToken { | |
| private(set) var retriesLeft = 3 | |
| var canRetry: Bool { | |
| return retriesLeft > 0 | |
| } | |
| func handleRetry() { | |
| guard canRetry else { return } | |
| retriesLeft -= 1 | |
| } | |
| } | |
| extension Observable where E == UserSession { | |
| func mapPollUser(with retryToken: AuthRetryToken) -> Observable<UserSession> { | |
| return flatMap { session -> Observable<UserSession> in | |
| return APIFactory.API().request(.myProfile) | |
| .flatMap { response -> Observable<UserSession> in | |
| if response.statusCode == StatusCode.okay { | |
| return Observable<Response>.just(response) | |
| .mapModel(model: User.self) | |
| .map { UserSession(token: session.token, user: $0) } | |
| } else if retryToken.canRetry { | |
| retryToken.handleRetry() | |
| return self.delay(1.0, scheduler: MainScheduler.instance).mapPollUser(with: retryToken) | |
| } else { | |
| return Observable.error(AuthServiceError.fetchUserError) | |
| } | |
| } | |
| } | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| createUser(with: accessToken) | |
| .do(onNext: { $0.persistAndMakeCurrent() }) | |
| .mapPollUser(with: AuthRetryToken()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment