概要
RxSwiftを学び始めるとよく出てくる疑問
「Hot ObservableとCold Observableって何が違うのか?」
このHotとColdの概念と特徴ポケモンの例えてざっくり理解してみようという取り組み
Cold Observable = 野生のポケモンとのバトル
Coldの特徴
- 購読(subscribe)されるまで何も起きない
- 毎回最初から同じ流れが始まる
- 観察者(Observer)ごとに独立した体験
例えるなら
トレーナーが草むらに入るたびに、野生のポケモンが1体ずつ出てくるみたいな感じ
- トレーナーAが草むらに入った → 野生のピカチュウが出現
- トレーナーBがあとから草むらに入っても → また別のピカチュウが最初から出てくる
- それぞれが独立した出会いをしてるのがCold Observable。
let cold = Observable.from(["Pikachu", "Charmander", "Bulbasaur"])
cold.subscribe(onNext: { value in
print("トレーナーA sees: \(value)")
})
cold.subscribe(onNext: { value in
print("トレーナーB sees: \(value)")
})
// 出力結果
トレーナーA sees: Pikachu
トレーナーA sees: Charmander
トレーナーA sees: Bulbasaur
トレーナー B sees: Pikachu
トレーナー B sees: Charmander
トレーナー B sees: Bulbasaur
Hot Observable = ポケモンリーグのライブバトル
Hotの特徴
- Observableが生成された瞬間からイベント発行スタート
- あとから来た観察者は途中からしか見れない
- ストリームは共有されている
例えるなら
テレビで放送中のポケモンリーグ決勝戦を見てる感じ
- バトルはすでに始まってる
- 途中でテレビをつけたら、その時点からしか見れない
- 他の観察者も同じ試合を共有して見ている(=shared)
let subject = PublishSubject<String>()
subject.onNext("Pikachu used Thunderbolt!") // 誰も見てない
subject.subscribe(onNext: { print("視聴 A sees: \($0)") })
subject.onNext("Charizard used Flamethrower!")
subject.subscribe(onNext: { print("視聴 B sees: \($0)") })
subject.onNext("Pikachu fainted!")
// 出力結果
視聴者 A sees: Charizard used Flamethrower!
視聴 A sees: Pikachu fainted!
視聴 B sees: Pikachu fainted!
まとめ:Hot vs Cold ポケモン対応表
特徴 | Cold Observable 🧊 | Hot Observable 🔥 |
---|---|---|
イベント発行のタイミング | 購読された時 | 作成された瞬間 |
各Observerの体験 | 独立 | 共有 |
ポケモンの例え | 草むらの野生ポケモン | ポケモンリーグ決勝 |
購読者が受け取るイベント | 最初から全部 | 購読時点からだけ |
主な用途 | ネットワーク/データ取得 | UIイベント/通知 |