繁体   English   中英

如何设置 Observable 来观察属性?

[英]How do I set an Observable to watch a Property?

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

假设我有一堂课

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<int> 因为这会破坏其他依赖于 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 ,然后想知道为什么您几乎没有收到任何事件! (原因是每次新事件到达时,Throttle 都会重置超时,因此当流频繁更新时,您永远不会超过超时值。)

尽管它有些陈旧且有些过时,但我发现本指南在尝试了解 Reactive 时非常有用。 Rx HOL更旧,甚至更过时,但仍然是一个非常有用的概念介绍 - 只是不要太从字面上理解代码示例。

如果这个类实际上是一个 ViewModel,你可能想要考虑ReactiveUI,但我建议你远离它,直到你真的对 Reactive 感到满意为止。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM