したかみ ぶろぐ

Unity成分多め

UniRxを「いらすとや」でまとめる

目次

始めに

UniRxは昔触ったことはありましたが、機能や使う利点がわからず長い間毛嫌いしていました。

しかしそうもいかず、今回はこちらの本を一通り読んで個人的にUniRxについての認識を簡単に図にしてまとめようと思います。


UniRxについて知らない方はこちらを参考にしてください。とても丁寧にまとめられています。

qiita.com


※注意

今回の内容では処理の内容や詳細ではなく、UniRxに対する認識をまとめたものとなります。

UniRxについて全くの無知の私がまとめた内容になるので、間違いや誤った解釈があるかもしれませんがご了承ください。



Observable・Observerについて

observeの意味

observeは監視する、観測すると言う意味を持ちます。(引用:英語「observe」の意味・使い方・読み方

プログラム的な読み方としてはこの意味で間違っていないと思います。


Observable

observableはobserve + able観察できると意味を持ちます。

個人的な認識で言えばポストみたいなものと考えています。

このポストにメッセージが入るとそれを通知します。

f:id:vxd-naoshi-19961205-maro:20210516135812p:plain



Observer

observerはobserve + er観察者を意味します。

Observableに何かしらが入ったときにそれを受け取ってその内容を処理するものと個人的に認識しています。

f:id:vxd-naoshi-19961205-maro:20210516135822p:plain



使用する流れ

まず、Observableは誰に入ってきたメッセージを送るかを登録します。

f:id:vxd-naoshi-19961205-maro:20210516142507p:plain


この後にObservableに何かしらのデータが入るとその登録したObserverにそのデータが送られて、Observerが処理を実行します。

f:id:vxd-naoshi-19961205-maro:20210516144537p:plain



Operatorについて

ObservableからObserverにデータを渡す間に処理を加えることが出来ます。

これによって、送るデータを制限したり加工できます。

その例をいくつか紹介します。


Where

Whereを途中に挟むことで、送られるデータをフィルタリングできます。

例えば、値の範囲外を除外したり特定の値のみを通すことが可能です。

f:id:vxd-naoshi-19961205-maro:20210516170836p:plain


Select

Selectは受け取ったメッセージを加工してObserverに渡したり、別のデータを渡すことが可能です。

f:id:vxd-naoshi-19961205-maro:20210516172530p:plain


SelectMany

SelectManyでは2つの使用方法があります。

1つ目は1つのメッセージから複数のメッセージに加工するものです。

f:id:vxd-naoshi-19961205-maro:20210516200851p:plain


2つ目は1つのメッセージから新たにObservableを作り、直列につなげるものです。

新しく作られたObservable(図では配達所)に通知が来ると、登録されたObserverにデータが送られます。

どのような時に使われるか調べてみたところ、WebRequestなどの非同期処理などで使われるようです。

Observableから1度しかメッセージが来ない場合はContinueWithの方が効率的に動作します。

f:id:vxd-naoshi-19961205-maro:20210516210133p:plain


Merge

Mergeを使うことによって、複数のObservableを1つのObservableに変換できます。それによって、どれか一つのObservableがメッセージを送ると登録されているObserverは処理を実行します。

ただし、送られるメッセージの型は統一する必要があります。

f:id:vxd-naoshi-19961205-maro:20210516204612p:plain


Zip

Zipでは複数のObservableからのデータを1つのデータにまとめて、Observerに通知できます。

ZipはそれぞれのObservableからのデータが揃わないとObserverに通知しないので注意してください。

f:id:vxd-naoshi-19961205-maro:20210516204732p:plain


Zipに似たOperatorでZipLatest, CombineLatest, WithLatestFromなどがあります。



最後に

今回はUniRxについて簡単にまとめました。

まだ勉強したばかりなので、Hot&ColdやObservableの破棄などについて詳しくありません。なので、これから実際に使ってみて何か新しい学びがあったらそれをまとめていこうと思います。



参考

qiita.com

qiita.com

Observableで非同期処理