状況
ReactivePropertyは値が同じ時は購読側に通知をしません。
通常はこれで問題ないのですが、通知して欲しい時がありました。
neuecc on Twitter: "UniRxだと通知飛ばす側がSetValueAndForceNotifyで強制的に飛ばせるって作りになってますね(定義側での挙動指定はできない)… "
使用方法
SetValueAndForceNotify
を使用すれば良いみたいです。
model.Count.Value = 1 // 同じ値は通知されない // ↓ model.Count.SetValueAndForceNotify(1) // 同じ値でも通知される
必要だった状況
購読しているメソッド内部でifで分岐しており、メソッド外部の値を参照していました。
public void BindCount(int count) { if (this.level == 1) { // ~~~ } else { // ~~~ } }
このメソッドではthis.levelというメソッド外部の値を参照していたため、this.levelが変わると、valueが同じでも、メソッドが再度実行されないといけない作りになっていました。
そのため、SetValueAndForceNotifyが必要となりました。
ですが、this.levelという値を参照をすべきではなく、ReactivePropertyをthis.levelとcountの2つの値で合成すべきでした。そうすれば、SetValueAndForceNotifyを使用する必要がなく、バグが引き起こされることもなかったと思います。
(なぜthis.levelを参照した作りにしたかというと、面倒だったので横着しました・・・(戒め))
結論
SetValueAndForceNotifyを使うか、合成したReactivePropertyを使用する。