UniRx 中的 BehaviorSubject 和 ReactiveProperty 有什么区别?

What is the difference between a BehaviorSubject and a ReactiveProperty in UniRx?

有什么区别?对我来说,它们看起来非常相似......你为什么要用一个而不是另一个?

行为主题是主题class的实现之一。它允许您检索使用 outObserver.

推送的最后一个值

响应式 属性 用于在发生某些事情时提供某种排序通知,它是回调的更简单替代方案。

例如: 如果您想将很多方法链接到游戏中的动作,例如玩家的移动,您可以使用此 Rective 属性.

如果你想获得最后被推送的值,例如在格斗游戏中进行连击,你可以使用行为主题

它们的相似之处在于它们都将存储最后给定的值并且您可以通过 public 属性.

访问它们

区别是:

  • ReactiveProperty 将发出事件 当且仅当值已更改 .
  • BehaviorSubject 将发出一个事件,无论新值是什么。

在他们的 C# 代码(开源)中 ReacitveProperty 检查新值和上一个值的相等性; BehaviorSubject 没有。事实上 none 的 ISubject 实现检查相等性。

什么时候应该使用一个而不是另一个?

当我只希望回调值发生变化时,我会使用 ReactiveProperty,即使替换可能更频繁地发生。当替换发生时我想要回调时,我会使用 BehaviourSubject

在大多数情况下,ReactiveProperty 更有用,因为通常您希望对更改做出反应。 BehaviorSubject 虽然不太常见,但有其自身的用途。

其他注意事项:

  • ReactiveProperty.SetValueAndForceNotify() 可用于调用回调,无论是否相等。
  • IObservable.DistinctUntilChanged() 可用于(次要)引入相等性检查。