132 lines
4.1 KiB
Swift
132 lines
4.1 KiB
Swift
/*:
|
|
> # IMPORTANT: To use **Rx.playground**:
|
|
1. Open **Rx.xcworkspace**.
|
|
1. Build the **RxSwift-OSX** scheme (**Product** → **Build**).
|
|
1. Open **Rx** playground in the **Project navigator**.
|
|
1. Show the Debug Area (**View** → **Debug Area** → **Show Debug Area**).
|
|
----
|
|
[Previous](@previous) - [Table of Contents](Table_of_Contents)
|
|
*/
|
|
import RxSwift
|
|
/*:
|
|
# Error Handling Operators
|
|
Operators that help to recover from error notifications from an Observable.
|
|
## `catchErrorJustReturn`
|
|
Recovers from an Error event by returning an `Observable` sequence that emits a single element and then terminates. [More info](http://reactivex.io/documentation/operators/catch.html)
|
|

|
|
*/
|
|
example("catchErrorJustReturn") {
|
|
let disposeBag = DisposeBag()
|
|
|
|
let sequenceThatFails = PublishSubject<String>()
|
|
|
|
sequenceThatFails
|
|
.catchErrorJustReturn("😊")
|
|
.subscribe { print($0) }
|
|
.addDisposableTo(disposeBag)
|
|
|
|
sequenceThatFails.onNext("😬")
|
|
sequenceThatFails.onNext("😨")
|
|
sequenceThatFails.onNext("😡")
|
|
sequenceThatFails.onNext("🔴")
|
|
sequenceThatFails.onError(TestError.test)
|
|
}
|
|
/*:
|
|
----
|
|
## `catchError`
|
|
Recovers from an Error event by switching to the provided recovery `Observable` sequence. [More info](http://reactivex.io/documentation/operators/catch.html)
|
|

|
|
*/
|
|
example("catchError") {
|
|
let disposeBag = DisposeBag()
|
|
|
|
let sequenceThatFails = PublishSubject<String>()
|
|
let recoverySequence = PublishSubject<String>()
|
|
|
|
sequenceThatFails
|
|
.catchError {
|
|
print("Error:", $0)
|
|
return recoverySequence
|
|
}
|
|
.subscribe { print($0) }
|
|
.addDisposableTo(disposeBag)
|
|
|
|
sequenceThatFails.onNext("😬")
|
|
sequenceThatFails.onNext("😨")
|
|
sequenceThatFails.onNext("😡")
|
|
sequenceThatFails.onNext("🔴")
|
|
sequenceThatFails.onError(TestError.test)
|
|
|
|
recoverySequence.onNext("😊")
|
|
}
|
|
/*:
|
|
----
|
|
## `retry`
|
|
Recovers repeatedly Error events by resubscribing to the `Observable` sequence, indefinitely. [More info](http://reactivex.io/documentation/operators/retry.html)
|
|

|
|
*/
|
|
example("retry") {
|
|
let disposeBag = DisposeBag()
|
|
var count = 1
|
|
|
|
let sequenceThatErrors = Observable<String>.create { observer in
|
|
observer.onNext("🍎")
|
|
observer.onNext("🍐")
|
|
observer.onNext("🍊")
|
|
|
|
if count == 1 {
|
|
observer.onError(TestError.test)
|
|
print("Error encountered")
|
|
count += 1
|
|
}
|
|
|
|
observer.onNext("🐶")
|
|
observer.onNext("🐱")
|
|
observer.onNext("🐭")
|
|
observer.onCompleted()
|
|
|
|
return Disposables.create()
|
|
}
|
|
|
|
sequenceThatErrors
|
|
.retry()
|
|
.subscribe(onNext: { print($0) })
|
|
.addDisposableTo(disposeBag)
|
|
}
|
|
/*:
|
|
----
|
|
## `retry(_:)`
|
|
Recovers repeatedly from Error events by resubscribing to the `Observable` sequence, up to `maxAttemptCount` number of retries. [More info](http://reactivex.io/documentation/operators/retry.html)
|
|

|
|
*/
|
|
example("retry maxAttemptCount") {
|
|
let disposeBag = DisposeBag()
|
|
var count = 1
|
|
|
|
let sequenceThatErrors = Observable<String>.create { observer in
|
|
observer.onNext("🍎")
|
|
observer.onNext("🍐")
|
|
observer.onNext("🍊")
|
|
|
|
if count < 5 {
|
|
observer.onError(TestError.test)
|
|
print("Error encountered")
|
|
count += 1
|
|
}
|
|
|
|
observer.onNext("🐶")
|
|
observer.onNext("🐱")
|
|
observer.onNext("🐭")
|
|
observer.onCompleted()
|
|
|
|
return Disposables.create()
|
|
}
|
|
|
|
sequenceThatErrors
|
|
.retry(3)
|
|
.subscribe(onNext: { print($0) })
|
|
.addDisposableTo(disposeBag)
|
|
}
|
|
|
|
//: [Next](@next) - [Table of Contents](Table_of_Contents)
|