RxSwiftで使えるオペレーターを備忘録的に書き綴っていきたいと思います。
また、公式Exanpleを参考にしています。
その1はこちら
その2はこちら
その3はこちら
その4はこちら
その5はこちら
その6はこちら
また、今回の内容はこちらの動画が非常に解りやすいです。
作業環境については、
を参考に構築して頂ければと思います。
早速、やっていきましょう!!
また、個人的にRxExanpleのサンプルコードは解りづらく感じましたので、自分なりにコードを書いてました😀
Error Handling Operators
RxExampleの流れでいくとConnectable Operatorsなのですが、説明出来るほど自身が理解出来ていないので、一旦飛ばしていますので、ご了承ください🙇♂️
catchAndReturn
public enum TestError: Swift.Error {
case test
}
func catchAndReturn() {
let disposeBag = DisposeBag()
let sequenceThatFails = PublishSubject<String>()
sequenceThatFails
.catchAndReturn("😊")
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
sequenceThatFails.onNext("😬")
sequenceThatFails.onNext("😨")
sequenceThatFails.onNext("😡")
sequenceThatFails.onNext("🔴")
sequenceThatFails.onError(TestError.test)
}
catchAndReturn() /*
😬
😨
😡
🔴
😊
*/
catchAndReturnはerrorが出力された際に、errorの代わりにcatchAndReturn()の引数に指定した値を流すオペレーターになります。
catch
func `catch`() {
let disposeBag = DisposeBag()
let sequenceThatFails = PublishSubject<String>()
let recoverySequence = PublishSubject<String>()
sequenceThatFails
.catch {
print("Error:", $0) // errorが流れた時
return recoverySequence // recoverySequenceに切り替える
}
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
sequenceThatFails.onNext("😬")
sequenceThatFails.onNext("😨")
sequenceThatFails.onNext("😡")
sequenceThatFails.onNext("🔴")
sequenceThatFails.onError(TestError.test)
sequenceThatFails.onNext("😍") // recoverySequenceのイベントしか値が流れません
recoverySequence.onNext("😊")
}
`catch`() /*
😬
😨
😡
🔴
Error: test
😊
*/
catchは、Errorが流れた時に別の出力に切り替える事が出来るオペレーターです。
retry, debug
public enum TestError: Swift.Error {
case test
}
func retry() {
let disposeBag = DisposeBag()
var count = 1
let sequenceThatErrors = Observable<String>.create { observer in
observer.onNext("🍎")
observer.onNext("🍐")
observer.onNext("🍊")
if count < 3 {
observer.onError(TestError.test)
print("Error encountered")
count += 1
}
observer.onNext("🐶")
observer.onNext("🐱")
observer.onNext("🐭")
observer.onCompleted()
return Disposables.create()
}
sequenceThatErrors
// .debug()
.retry(3)
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
retry() /*
🍎 //count = 1
🍐
🍊
Error encountered
🍎 // count = 2
🍐
🍊
Error encountered
🍎 // count = 3 なのでerrorが流れない
🍐
🍊
🐶
🐱
🐭
*/
retryはerrorが流れた時に、retryで指定した整数分、イベントを流し続けるオペレーターです。
今回のサンプルコードでは、変数countが3未満だとerrorが出るObservarを作成して、それに対してretry(3)を指定してsubscribeしていますね。
なのでcount=3の時には正常に値が全て流れます。
また、debug() をコメントインしてビルドして頂くと、次のような出力になります。
2022-07-29 15:11:09.961: MyPlayground.playground:31 (retry()) -> subscribed
2022-07-29 15:11:09.962: MyPlayground.playground:31 (retry()) -> Event next(🍎)
🍎
2022-07-29 15:11:09.970: MyPlayground.playground:31 (retry()) -> Event next(🍐)
🍐
2022-07-29 15:11:09.970: MyPlayground.playground:31 (retry()) -> Event next(🍊)
🍊
2022-07-29 15:11:09.971: MyPlayground.playground:31 (retry()) -> Event error(test)
2022-07-29 15:11:09.971: MyPlayground.playground:31 (retry()) -> isDisposed
Error encountered
2022-07-29 15:11:09.972: MyPlayground.playground:31 (retry()) -> subscribed
2022-07-29 15:11:09.972: MyPlayground.playground:31 (retry()) -> Event next(🍎)
🍎
2022-07-29 15:11:09.972: MyPlayground.playground:31 (retry()) -> Event next(🍐)
🍐
2022-07-29 15:11:09.972: MyPlayground.playground:31 (retry()) -> Event next(🍊)
🍊
2022-07-29 15:11:09.972: MyPlayground.playground:31 (retry()) -> Event error(test)
2022-07-29 15:11:09.972: MyPlayground.playground:31 (retry()) -> isDisposed
Error encountered
2022-07-29 15:11:09.972: MyPlayground.playground:31 (retry()) -> subscribed
2022-07-29 15:11:09.972: MyPlayground.playground:31 (retry()) -> Event next(🍎)
🍎
2022-07-29 15:11:09.972: MyPlayground.playground:31 (retry()) -> Event next(🍐)
🍐
2022-07-29 15:11:09.972: MyPlayground.playground:31 (retry()) -> Event next(🍊)
🍊
2022-07-29 15:11:09.972: MyPlayground.playground:31 (retry()) -> Event next(🐶)
🐶
2022-07-29 15:11:09.979: MyPlayground.playground:31 (retry()) -> Event next(🐱)
🐱
2022-07-29 15:11:09.979: MyPlayground.playground:31 (retry()) -> Event next(🐭)
🐭
2022-07-29 15:11:09.979: MyPlayground.playground:31 (retry()) -> Event completed
2022-07-29 15:11:09.979: MyPlayground.playground:31 (retry()) -> isDisposed
このように、処理の流れがひと目で解るオペレーターになります。debug()を駆使しながら、他のオペレーターの動きを見ていくと、更に理解が深まりそうですね😆
おわりに
以上でRxExampleのオペレーター紹介は終わりです😭
早く使いこなせるように引き続き学習していきたいと思います。
お疲れ様でした。🙇♂️