ニートが学ぶUniRx 入門編その7

はいどーもUniRx完全に理解してないニートです。
本日はこれ。
https://qiita.com/toRisouP/items/f6088963037bfda658d3

HotとColdを調べるに至った理由

UniRxの記事を読んでいたらHotとColdという話が出ていました。
LINQで言う遅延実行的な何かかなあと勝手に思ったのですが、きちんと理解せねばならんということでググった次第です。
すると引っかかったのは例のとりすーぷさんの記事。
HotとColdの概要はそっちを眺めてください。

ほとんどのオペレータはCold

ほとんどのオペレータはColdな性質を持っているようです。
これはLINQの多くが遅延実行することに似ているのではないでしょうか。
しかしColdな性質を持つオペレータを明示的にHotに変換することもできるようです。
なるほど?

Hotだとどうなるのか

Coldな性質を持つオペレータはSubscribeされるまでは何の仕事もしません。
それとは対象的に、Hotな性質を持つオペレータはSubscribeする前に仕事をし始めます。
記事中のサンプルを試した感じ、Hotな性質を持つオペレータ末尾までストリームが進み、そこで待機する感じですかね。
で、Coldな性質を持つオペレータしかない場合は、送られてきたストリームを完全に破棄する、ということですかね。
ウーンよくわからないのでもう一つの記事も読んでみましょう。

Hot変換についての記事

こちらの記事になります。
https://qiita.com/toRisouP/items/c955e36610134c05c860

この記事によれば「一番Hot変換が重要となるシチュエーションは1つのストリームを複数回Subscribeする場合」ということらしいです。
僕のイメージでは1つのストリームを複数回Subscribeすると、C#のイベントのような感じで使えるのではないかと思っていたのですが、どうも「Subscribeのたびに新しいストリームが生成される」ようです。
つまり複数箇所でSubscribeすると、そのたびにメモリを使ってしまうのですね。
どこでSubscribeされるかわからない状況では(そういうことは多いと思います)、これはよろしくありません。
そこで共通するオペレータ部分をHotに変換し、残りの個々の処理で必要となる部分で枝分かれさせるようです。
一番簡単なのは「Publish()とRefCount()を組み合わせるもの」らしいです。
僕もとりあえずこれだけ覚えておきたいと思いますよ。

ただし

追記:ReactivePropertyはそもそもHotみたいです。というわけでここのことは全部間違いです。ちゃんちゃん。

とりすーぷさんが公開しているGitHubのプロジェクトですが、複数回SubscribeしているにもかかわらずHotに変換していません(たぶん。理解が不完全なので違ったらメンゴ)。
https://github.com/TORISOUP/MuscleDropSrc/tree/master/Players
これはどういうことなのか?
僕なりに考えてみたのですが、起点からSubscribeに至るまでのオペレータがそれぞれで違うので、複数回SubscribeしているにもかかわらずどこでもHot変換していないのではないかなーと思いました。
つまりHotに変換しようがないのでHotに変換せず、各コンポーネントごとにSubscribeして新しいストリームを生成しているのですね。

注*全然理解してないので違う可能性が大です。僕はこう理解してみた、というレベルの話です。

おわりに

だんだんと難しくなってまいりました。
僕のチンパン脳では厳しいものがありますが、石の上にも三年の気持ちを忘れず地道に続けていきますよ。

ほなそんな感じでまた。

フォローする