Skip to content

Instantly share code, notes, and snippets.

@huguesbr
Created April 5, 2017 08:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save huguesbr/cbe7d4400fc8d737f72797df715a1917 to your computer and use it in GitHub Desktop.
Save huguesbr/cbe7d4400fc8d737f72797df715a1917 to your computer and use it in GitHub Desktop.
Rx `retryPromptOn` operator. Prompt a user to retry a sequence if an error is emitted
extension ObservableType {
public func retryPromptOn(_ vc: UIViewController) -> Observable<E> {
return self.retryWhen { (error: Observable<Error>) -> Observable<Void> in
return vc.rx.retryPrompt(error: error)
}
}
}
extension Reactive where Base: UIViewController {
func retryPrompt(error: Observable<Error>) -> Observable<Void> {
let retry = PublishSubject<Void>()
error.subscribe { (error: Event<Error>) in
let alert = UIAlertController(title: error.element?.localizedDescription, message: "Retry?", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "No", style: .cancel) { _ in
retry.onError(error.element!)
})
alert.addAction(UIAlertAction(title: "Retry", style: .default) { _ in
retry.onNext()
})
self.base.present(alert, animated: true)
}
return retry
}
}
@huguesbr
Copy link
Author

huguesbr commented May 4, 2017

Usage (assuming your are on a view controller)

let error = NSError(domain: "...", code: 1, userInfo: [NSLocalizedDescriptionKey: "Didn't work..."])
let observable = Observable<Int>.create { (observer) -> Disposable in
    observer.onNext(1)
    observer.onNext(2)
    observer.onError(error)
    return Disposables.create()
}
observable.retryPromptOn(self).subscribe { print($0) }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment