はじめに
RxSwiftを理解するにあたり、Hot/Coldは一つの関門だと思います。そこで各特徴だけをまとめてみました。
Hotの特徴
- HotなObservableはsubscribeされなくても動作する
- HotはObservableは前のColdを動作させる
- HotなObservableは分岐できる
- HotなObservableはObserverを複数持てる
- HotなObservableのイベントは各Observerで共有される
- 各Observerに対して同じイベントが送出される。つまりそこまでのColdは何度も呼ばれない(分岐の性質)
- すでに流れたイベント(Next)は送出されない。つまり途中からsubcribeすると途中からしか受け取れない。
Coldの特徴
- ColdなObservableはsubscribeするまで動作しない
- ColdなObservableは分岐できない
- ColdなObservableはObserverを1つしか持てない
SubjectはHot
- Publish Subject
- Behavior Subject
- Relay Subject
ほとんどのオペレータはCold。Hotに関連するオペレータは少数
Hotに関連するオペレータ
- ConnectObservableを返すオペレータ
- multicast()
- Subjectを指定して一旦イベントを受けるようにする
- publish()
- PublishSubjectに、multicastする
- replay()/replayAll()
- ReplaySubjectに、multicastする
- multicast()
ConnectObservableとは
- connect()メソッドを呼ぶことで、Hot変換が完了する。
- 複数のObserverがHot変換されたストリームを最初から受け取りたいときに使用する。connect()を呼ぶまで動作しないので、その間にすべてのObserverをsubcribeさせておくことができる。
上記以外のオペレータ
- share()
- 内部的には、publish().refCount()
- refCount()
- Hotだがsubcribeするまで動作しない。内部的には、最初にsubcribeされた時点でconnectを呼ぶ。
- shareReplay()
- 内部的には、publish().refCount().replay()
- 「Hotだがsubcribeするまで動作しない」を守りつつ、指定された個数だけ値をreplayする。RxSwiftのExampleでもよく使用されている。
- 変数的に扱いつつ、再計算させないようにするときに、shareReplay(1)をつけると良い。
- shareRelayLatestWithConnected()
- Driverはデフォルトで同じ動作をする。connect中でないと最後の値が取れない。一度.completedが流れたら、そのあとにはreplayされず.completdしか流れてこない。
さいごに
Hot/Coldの特徴、Hot変換についてまとめたので、それぞれの違いについて分かりやすくなったかと思います。