🍎
[RxSwift] concat と merge の使い分け
経緯
どちらもObservableを合成するためのメソッドだが、
いまいちどう使い分けて良いか曖昧なままだったので。
公式のマーブル図はここから参照してます。
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