HotとColdの違い
- Hot
- 自発的に発行しているやつ
- Cold
- これ自体は動かないフィルターのようなやつ
- 遅延評価みたいなもの
System.Linqでも、その時点で評価したいならToList()しないといけないよね。
例
1 Coldに接続
var sc = new SubscribeCheckerWithConsoleWrite<int>();
var source = Observable.Range(1, 3)
.Do(x => Console.WriteLine($"Do:{x}"));
source.Subscribe(sc);
source.Subscribe(sc);
出力
Do:1 OnNext:1 Do:2 OnNext:2 Do:3 OnNext:3 OnCompleted Do:1 OnNext:1 Do:2 OnNext:2 Do:3 OnNext:3 OnCompleted
Subscribe()される度に動作する。
2 Publish()でHot変換
var sc = new SubscribeCheckerWithConsoleWrite<int>();
var source = Observable.Range(1, 3)
.Do(x => Console.WriteLine($"Do:{x}"))
.Publish();
source.Subscribe(sc);
source.Subscribe(sc);
source.Connect();
出力
Do:1 OnNext:1 OnNext:1 Do:2 OnNext:2 OnNext:2 Do:3 OnNext:3 OnNext:3 OnCompleted OnCompleted
Connect()された時点で動作する。
3 よく使うPublish().RefCount()
var sc = new SubscribeCheckerWithConsoleWrite<int>();
var source = Observable.Range(1, 3)
.Do(x => Console.WriteLine($"Do:{x}"))
.Publish()
.RefCount();
source.Subscribe(sc);
source.Subscribe(sc);
出力
Do:1 OnNext:1 Do:2 OnNext:2 Do:3 OnNext:3 OnCompleted OnCompleted
接続された(1つ目のSubscribe)時点で動作する。