Rx/HotとCold

Last-modified: 2020-02-18 (火) 22:44:54

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)時点で動作する。