Skip to content

Instantly share code, notes, and snippets.

@daltonclaybrook
Created May 10, 2017 20:33
Show Gist options
  • Select an option

  • Save daltonclaybrook/811450d6211d15e04d65f64b3a338e94 to your computer and use it in GitHub Desktop.

Select an option

Save daltonclaybrook/811450d6211d15e04d65f64b3a338e94 to your computer and use it in GitHub Desktop.
Retry with RxSwift
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)
}
}
}
}
}
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