RxSwiftのPlaygroundを読んでみるシリーズ今回は
エラー処理についてです。
(Error_Handling_Operators)
Error Handling Operators
今回はerrorを扱う処理についてです。
【Swift】RxSwiftのPlaygroundを読む①でみたように、
Observableにerrorが流れてくると、もうそのObservableには何も流れてきません。
それでは困る!という場合や、
errorではなくcompleteとして処理したい場合などに以下のOperatorを使用します。
catchErrorJustReturn
errorが流れてきたら、
errorを引数で渡した値のnextイベントに変換する。
その後completeを自動で流し、Observableを終了する。
let disposeBag = DisposeBag()
extension String: ErrorType {}
let catchErrorJustReturn = PublishSubject<String>()
catchErrorJustReturn
.catchErrorJustReturn("🍑")
.subscribe { print($0) }
.addDisposableTo(disposeBag)
catchErrorJustReturn
.onNext("🍎")
catchErrorJustReturn
.onError("An error occurred.")
結果
Next(🍎)
Next(🍑)
Completed
catchError
errorが流れてきたら、
errorを流す代わりに、
subscribe対象のObservableを、
引数で指定した別のObservableに変更する。
let disposeBag = DisposeBag()
extension String: ErrorType {}
let catchError = PublishSubject<String>()
let recover = BehaviorSubject(value: "🍊")
catchError
.catchError { _ in recover }
.subscribe { print($0) }
.addDisposableTo(disposeBag)
catchError
.onNext("🍐")
catchError
.onError("An error occurred.") // このタイミングでrecoverをsubscribeし、BehaviorSubjectの挙動に従い🍊が流れる
recover
.onNext("🍇")
結果
Next(🍐)
Next(🍊)
Next(🍇)
retry
errorが流れてきたら、
errorを流す代わりに、
同じObservableをsubscribeし直す。
引数でsubscribeし直す回数を指定できる。
指定しない場合は無限にsubscribeし直す。
let disposeBag = DisposeBag()
extension String: ErrorType {}
var count = 0
let retry = Observable<String>.create { observer in
if count < 5 {
observer.onNext("🍑")
observer.onError("An error occurred.")
count += 1
}
else {
observer.onCompleted()
}
return NopDisposable.instance
}
retry
.retry()
.subscribe { print($0) }
.addDisposableTo(disposeBag)
結果
Next(🍑)
Next(🍑)
Next(🍑)
Next(🍑)
Next(🍑)
Completed
おわりに
エラー時の取り扱いは要件に直結する重要な部分なので、
しっかり理解したいです。
次回最後はデバッグ処理についてです。