LoginSignup
9

More than 3 years have passed since last update.

RxSwiftのHot/Coldを理解する

Posted at

はじめに

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変換

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9