RxSwiftのHot/Coldを理解する


はじめに

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する

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変換についてまとめたので、それぞれの違いについて分かりやすくなったかと思います。

参考

今日こそ理解するHot/Cold
今日こそ理解するHot変換