【问题标题】:ReactiveProperty initial valueReactiveProperty 初始值
【发布时间】:2017-11-16 22:17:00
【问题描述】:

我正在尝试为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

【问题讨论】:

    标签: c# xamarin mvvm reactive-property


    【解决方案1】:

    使用 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);
        }
    

    基本上,您要查找的是 initial valueReactivePropertyMode.RaiseLatestValueOnSubscribe 标志。

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

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

    我使用了 ReactiveProperty 3.6.0。

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

    【讨论】:

    • 感谢您的提示。您对基于计时器的连接测试仪有什么建议吗?它用于来自网络上设备的实时流数据,因此如果设备不可用,我需要通知用户。
    • 嗨@GabrielRobert。我不知道您的 networkDiscovererService 类的内部结构,但通常这种类有类似 Connected/Disconnected 事件来报告状态。在这种情况下,基于计时器的连接应该是你最后的手段:)
    • 这只是一个针对 IP 的 ping 服务。我每隔几秒钟触发一次 ping 以确保它始终可以访问。为了可以访问,用户需要在同一设备的 wifi 上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    相关资源
    最近更新 更多