[Xcode/Swift] RxSwiftのHotとColdをポケモンでざっくり理解する

概要

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イベント/通知