🍎

[RxSwift] concat と merge の使い分け

2022/03/01に公開

経緯

どちらもObservableを合成するためのメソッドだが、
いまいちどう使い分けて良いか曖昧なままだったので。
公式のマーブル図はここから参照してます。
https://reactivex.io/

concat


concatの場合作成した際のObservableの順序通りに処理を実行します。

let blue = PublishSubject<Int>()
let green = PublishSubject<Int>()
let yellow = PublishSubject<Int>()
let red = PublishSubject<Int>()

Observable.of(
    blue, 
    green,
    yellow,
    red) // yellowがcompleteしないとredは呼ばれない
    .concat()

merge


mergetの場合複数Observableをinterleavesする可能性があリます。
よって最初に定義したgreenの完了を待つことはなく、
状況によってはyellowのストリームが間に来ることがあります。
上記図の例で言うと、
青1はconcatの場合は、緑100の前に呼ばれるはずです。

let blue = PublishSubject<Int>()
let yellow = PublishSubject<Int>()
let green = PublishSubject<Int>()
let red = PublishSubject<Int>()

Observable.of(
    green, 
    yellow, 
    red,
    blue) .merge()

まとめ

あくまで自分が複数のObservableを合成する際に、
渡す引数の通りの順序で処理を行なってほしい場合はconcat
ただ並行処理として複数のObservableを一片に合成したい場合はmerge
という認識での使い分けが出来そうです。

Discussion