如何设置可观察量以监视属性?



我意识到这可能是一个非常愚蠢的问题,但关于反应式扩展的文档既不透明又分散。

假设我有一个类

public class Foo
{
public int FooState {get;set;}
}

FooState更新非常频繁。 这看起来像是 IObservable 的理想情况,特别是因为我必须在另一个类中跟踪该状态。

public class Bar
{
public Foo Foo {get;set;}
private void DoStuffWithFooState()
{
//operate on Foo.FooState here
}
}

现在,我不能将 FooState 更改为 IObservable因为这会破坏其他依赖 Foo 的东西。

我想做的是在 Bar 上声明一个监视 FooState 的 IObserver 属性。

这不是一个基本的用例吗? 我该怎么做?

可以使用 BehaviorSubject 将属性转换为可观察流和只能从中读取最新值的属性。

public class Foo
{
private readonly BehaviorSubject<int> _fooSubject = new BehaviorSubject<int>(0);
public int FooState
{
get => _fooSubject.Value;
set => _fooSubject.OnNext(value);
}
public IObservable<int> ObservableFooState => _fooSubject;
}

如果 FooState 的值经常更改,则可能需要在订阅之前使用 Sample 运算符。 例如

//print out value every two seconds
foo.ObservableFooState
.Sample(TimeSpan.FromSeconds(2)) 
.Subscribe(Console.WriteLine);

请注意,一个常见的错误是使用油门,然后想知道为什么你几乎不会得到任何事件! (原因是每次有新事件到达时,Throttle 都会重置超时,因此当流频繁更新时,您永远不会超过超时值。

虽然它很旧并且部分略有过时,但我发现本指南在尝试学习 React 时非常有用。 Rx HOL甚至更旧,甚至更过时,但仍然是一个非常有用的概念介绍 - 只是不要太从字面上理解代码示例。

如果这个类实际上是一个 ViewModel,你可能想考虑 ReactiveUI,但我建议你远离它,直到你真正熟悉 Reactive。

请注意,我没有在上面显示释放/完成逻辑。 您应该考虑何时(如果有的话)要在_fooSubject上调用OnDone。另请记住,订阅是一次性的,您可能希望确保在订阅者超出范围时处理它们。

最新更新