ReactiveProperty初始值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ReactiveProperty初始值相关的知识,希望对你有一定的参考价值。

我正在尝试为public ReactiveProperty<string> ConnectionStatus设置初始值。

public ViewModelConstructor()
{
    ConnectionStatus = Observable
                    .Interval(RefreshInterval)
                    .Select(x => Observable.FromAsync(() => networkDiscovererService.CanDiscoverAsync("192.168.1.1", RequestTimeout)))
                    .Concat()
                    .Select(isConnected => isConnected ? $"connected" : $"not connected")
                    .ToReactiveProperty();
}

即使我试图像这样实例化它

public ReactiveProperty<string> ConnectionStatus { get; } =
            new ReactiveProperty<string>("Checking connectivity...");

在观察者返回某些东西之前它仍然是空的。

有任何想法吗?我正在使用这个library

答案

使用ReactiveProperty ctor获取订阅的初始值(如behaviorSubject或Replay(1)):

    [Test]
    public void ShouldReturnAValuOnSubscribe()
    {
        var testScheduler = new TestScheduler();
        var testableObserver = testScheduler.CreateObserver<int>();

        var reactiveProperty = new ReactiveProperty<int>(30);
        reactiveProperty.Subscribe(testableObserver);

        Assert.AreEqual(30, testableObserver.Messages.Single().Value.Value);
    }

要使用.ToReactiveProperty()获取订阅的初始值(如behaviorSubject或Replay(1)):

    [Test]
    public void ShouldReturnAValuOnToReactiveProperty()
    {
        var testScheduler = new TestScheduler();
        var testableObserver = testScheduler.CreateObserver<int>();

        var reactiveProperty = Observable.Never<int>().ToReactiveProperty(40);
        reactiveProperty.Subscribe(testableObserver);

        Assert.AreEqual(40, testableObserver.Messages.Single().Value.Value);
    }

不要在订阅时获得初始值 - 更改ReactivePropertyMode:

    [Test]
    public void ShouldNotReturnAnInitialValue_WhenModeIsNone_AndOnSubscribe()
    {
        var testScheduler = new TestScheduler();
        var testableObserver = testScheduler.CreateObserver<int>();

        var reactiveProperty = new ReactiveProperty<int>(30, ReactivePropertyMode.None);
        reactiveProperty.Subscribe(testableObserver);

        Assert.IsEmpty(testableObserver.Messages);
    }

基本上,您正在寻找的是初始值和ReactivePropertyMode.RaiseLatestValueOnSubscribe标志。

在第一种情况下,您忘记使用初始值提供ToReactiveProperty()(例如ToReactiveProperty(30))

它应该在第二种情况下适用于你 - 默认情况下模式设置为ReactivePropertyMode.RaiseLatestValueOnSubscribe(检查ShouldReturnAValuOnSubscribe)。尝试显式设置模式(如在ShouldNotReturnAnInitialValue_WhenModeIsNone_AndOnSubscribe中)。

我使用了ReactiveProperty 3.6.0。

顺便说一句,基于计时器测试连接不是一个好主意:)

以上是关于ReactiveProperty初始值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Swift 使用此代码片段为 iOS 应用程序初始化 SDK?

Backbone.js 状态管理/基于 url 片段的视图初始化

如何在使用cardview的片段中初始化gridlayoutmanager?

我想在每次选择底部导航项时初始化片段

vscode 用户代码片段 vue初始化模板 Snippet #新加入开头注释 自动生成文件名 开发日期时间等内容

环境初始化 Build and Install the Apache Thrift IDL Compiler Install the Platform Development Tools(代码片段