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

はいどーもこんにちはUniRxを完全に理解したいニートです。
今回は以下の記事を参考にしながら進めますよ。
https://qiita.com/toRisouP/items/851087b4c990d87641e6
前回同様、今回も学習中の備忘録なので間違いがあっても知りません。

IObserverインターフェース再び

IObserverインターフェースには3つのメソッドが定義されています。
今回はそれらを詳しく見ていこうと、そういうわけです。

記事によればOnNextは「イベントの通知」を表すとのことです。
これは前回の僕の記事の予想通りですね。
基本的な使い方もC#のイベントとさほど変わりません。

さてイベントを通知するとき「イベントが発行されたタイミングが重要であって、OnNextメッセージの中身は何でもいい」というときがあるかと思います。
そのことを明示的に表すためにUnit型なるものが存在するようです。
別に使わなくても問題はないでしょうが、Unit型の意味さえ知っていればコードで意図を伝えられるので、なるべく使いたいところですね。
とりーすぷさんの記事に「シーン初期化完了」を通知するサンプルがありますのでそれも参照してください。

OnErrorメッセージ

これも予想通り、例外が発生したときに通知されるメッセージのようです。
大切なのは「OnErrorをSubscribeが検知するとストリームの購読を中止してしまう」ということでしょう。
「よくわからん不可解なバグに悩まされてうわあああ!」とならないようにこれは意識しておきたいです。
こうならないためには、例外が発生する可能性があるならば適切に処理する必要があります(例外ハンドリング用オペレータを使う)。

例外ハンドリング用オペレータは複数種類があるようなのですが、とりあえずOnErrorRetryとRetryを覚えておけば当面は大丈夫そうですかね……。
Catchは「別のストリームに差し替える」とのことで、UniRx初心者が使いこなすのは難しそうな香りがします。

OnCompletedメッセージ

購読終了を意味するのがOnCompletedメッセージのようです。
例えばC#のイベントでは購読終了のとき、いちいちデリゲートを-=演算子で削除しなければいけませんでしたが、そんなことしなくても単にOnCompletedメッセージを発行するだけでよい、ということでしょうか。

OnCompletedとDisposeの違い

Subscribeメソッドの戻り値はIDisposable型です。
ということはDisposeメソッドを実行すればリソースの解放を意味するはずです。
これとOnCompletedメソッドは何が違うのでしょうか?
とりすーぷさんの記事によれば「Dispose()を実行して購読中止した場合、OnCompletedが発行されるわけではない」とのことです。
これは大きな違いですね。
覚えておきたいです。

しかし「じゃあDisposeメソッドっていつ使うねん」という疑問が湧きます。
それはズバリ、特定のストリームのみ購読中止したいときです。
C#のイベントで言えば、特定のイベントハンドラだけ登録を解除したいとき-=演算子を使いますよね。
それと同じ感じのようです。
ただしDisposeした場合はOnCompletedは発行されないので、そこだけ気をつけたいですね。

ストリームのライフサイクル

ストリームの実態はSubjectらしいです。
言い換えれば、利用されていないストリームもSubjectが生きている限りは裏で動き続けることになります。
例えばGameObjectをDestoryしても、Subjectが生きているならばストリームは裏で可動し続けます。
ゲームでいわゆる「重くなる」状態というのは致命的なので、ストリームは「不要になったら必ず解放する」ことが原則のようです。最悪エラーが出てゲームが落ちますしね……。

以上のことはメモリ管理が難しい言語を使っている方には当たり前のことかもしれませんが、僕のようなGCのある言語しか使ったことのない人間にはちょっと難し目のことです。
意識していきたいと思いますよ。

なお、先の例のGameObjectがDestroyされたとき、自動でストリームの購読を中止するにはAddToメソッドを使えばよいようです。
これはDestroyと同時にDisposeメソッドを呼び出してくれるもののようです。
便利ですね。

終わりに

今回の部分はそんなに難しい話はなかったです。
やはり最初の一手目をゆっくりしっかり理解していけば、あとは「お、こんな便利機能あるんだ!」的な感じで理解していけるんですかね。
Zenjectももっと上手く使いこなしたいですねえ……。

ほなそんな感じでまた。

フォローする