Help us understand the problem. What is going on with this article?

RxSwiftのオペレーターの勉強 その2(結合編)

Atrae Advent Calendar 2019 の18日目を担当するアガツマです。
普段は、ビジネス版マッチングアプリ yenta のiOS版を開発をしています。

前回に続いて、RxSwiftのオペレーターについて書きます。
今回は、オペレーターの中でも複数のobservableを合成(結合)するようなものについてまとめました。
RxSwiftを勉強する際の参考になったら嬉しいです。

※RxSwiftのオペレーターとは、Observableに用意されているイベントを加工する用のメソッドのことを指します

複数のobservableを合成するオペレーター

combineLatest

処理
2つのObsrvableのを監視してどちらか1つのObsrvableが送信される時、それぞれのObservableから送信される最新の値をまとめて送信する。

用途

複数の変数を監視する必要がある場合(複数入力のバリデーションなど)
複数の値を組み合わせる処理

コード

        let i = PublishSubject<Int>()
        let s = PublishSubject<String>()

        _ = Observable.combineLatest(i, s) {
            "\($0) + \($1)"
          }
          .subscribe {
            print("onNext: ", $0)
          }

        i.onNext(1)
        s.onNext("A")
        i.onNext(2)
        s.onNext("B")
        s.onNext("C")
        i.onNext(3)

出力結果

onNext:  next(1 + A)
onNext:  next(2 + A)
onNext:  next(2 + B)
onNext:  next(2 + C)
onNext:  next(3 + C)

withLatestFrom

処理
あるObservableがイベントを送信した際に、もう一方の Observabe の最新のイベントを合成する。

用途
1つのアクションが起きた際に、他の値に対して何かしら処理をする場合。
(ボタンが押された時などに、他の要素がどのような値になっているか知りたいときなど)

コード

        let i = PublishSubject<Int>()
        let s = PublishSubject<String>()

        i.withLatestFrom(s)
            .subscribe({ string in
                print("onNext: ", string)
            })
            .disposed(by: disposeBag)

        i.onNext(1)
        s.onNext("A")
        i.onNext(2)
        s.onNext("B")
        s.onNext("C")
        i.onNext(3)

出力結果

onNext:  next(A)
onNext:  next(C)

zip

処理
複数の Observable のイベントを1つづつ順番に合成する。

用途
並列処理をしたい場合(API通信で複数のレスポンスを待ってから処理を進めたいときなど)

コード

        let i = Observable.of(1,2,3,4,5)
        let s = Observable.of("A","B","C")

        _ = Observable.zip(i, s) {
            "\($0) + \($1)"
          }
          .subscribe {
            print("onNext: ", $0)
        }

出力結果

onNext:  next(1 + A)
onNext:  next(2 + B)
onNext:  next(3 + C)
onNext:  completed

おわりに

今回は、RxSwiftでのObservableの合成についてまとめてみました。
このような、オペレーターを組み合わせることで、様々な処理を実現することができるのだなと思いました。
今後は、RxSwiftを用いたアーキテクチャーなどの理解を深めていきたいと思います!

参考

RxSwift研究読本1 入門編
ReactiveX Document

_xAGAx_
atrae
People Techカンパニーとして、転職サイトGreen, ビジネスマッチングアプリyenta, 組織改善プラットフォームwevoxなどのサービスを運営。全ての社員が誇りを持てる組織と事業の創造にこだわり、関わる人々がファンとして応援したくなるような魅力ある会社であり続けることを目指しています。
https://atrae.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした