LoginSignup
1
1

More than 1 year has passed since last update.

RxSwift基礎-オペレーターその7

Posted at

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のオペレーター紹介は終わりです😭
早く使いこなせるように引き続き学習していきたいと思います。
お疲れ様でした。🙇‍♂️

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1