Xamarin.ios 订阅延迟时ObservablesPropertyHelper的初始值

Xamarin.ios 订阅延迟时ObservablesPropertyHelper的初始值,xamarin.ios,reactiveui,Xamarin.ios,Reactiveui,我最近开始在ViewModels中使用OAPH 为了提高性能,我使用了延迟订阅 给定以下模型类: 公共类模型:ReactiveObject { [反应ui.Fody.Helpers.Reactive] 公共字符串值{get;set;} } 以及视图模型: 公共类ViewModel:反应对象 { 私有只读模型_模型; 私有只读ObservablesPropertyHelper\u PropertyAph; 公共视图模型 { 这个._model=model; this.whenyValuex=>x.

我最近开始在ViewModels中使用OAPH

为了提高性能,我使用了延迟订阅

给定以下模型类:

公共类模型:ReactiveObject { [反应ui.Fody.Helpers.Reactive] 公共字符串值{get;set;} } 以及视图模型:

公共类ViewModel:反应对象 { 私有只读模型_模型; 私有只读ObservablesPropertyHelper\u PropertyAph; 公共视图模型 { 这个._model=model; this.whenyValuex=>x.\u model.Value .ToPropertythis,名称this.Property,out this.\u propertyAph,deferSubscription:true,调度程序:RxApp.MainThreadScheduler; } 公共字符串属性=>this.\u propertyOAPH.Value; } 第一次访问视图模型的属性时,将订阅源observable,并返回默认的OAPH值

在我的示例中,我使用WhenyValue扩展方法,得到的可观察对象将以一个值开始。 OAPH观察到此值后,ViewModel将发出PropertyChanged事件

var模型=新模型{Value=Value}; 新的ViewModel模型 .WhenyValueX=>x.属性 .Selectp=>p??无效的 .Subscribep=>Console.WriteLine$-ViewModel属性:{p}; /** *-ViewModel属性:null *-ViewModel属性:值 */ 有没有办法让OAPH初始值成为可观测源的第一个值

我理解,从纯反应性的角度来看,如果设置了OAPH的初始值,则初始值暂时为空或错误不是问题。但在iOS上,如果使用自动布局,则TableViewCell高度在初始化时根据其内容计算。TableViewVell高度随后不会更新

我首先调查是否有一种简单的方法可以用reactiveUI解决这个问题。如果没有,我将研究纯iOS解决方案

注:

必须在主线程上观察ViewModel的属性,因为它将触发UI更改 为OAPH设置默认值不是一个选项,因为源可观察的第一个值模型属性值在订阅之前可能会更改。
我能让它工作

ViewModel.cs

公共视图模型 { 这个._model=model; Observable.Defer=>this.WhenyValueX=>x.\u model.Value.toProperty此,此.Property的名称,输出此属性。\u propertyAph,deferSubscription:true,调度程序:RxApp.MainThreadScheduler;}
我使用Observable。Defer将推迟对属性的评估,直到Observable被订阅。

Skip1是否足够?否,它不会。在我的问题中可能不清楚,但我希望在访问ViewModel属性时同步获得正确的初始值。谢谢您的回答。但我不确定它是否解决了问题。使用延迟订阅的目的是限制可观察订阅以提高性能。您的解决方案使用的是IConnectableObservable,并调用Connect方法。这意味着从一开始就订阅了可观察对象。我的理解正确吗?我完全理解您为什么使用可观察的回放。但我不明白的是,它是如何符合这一理念的?您的解决方案与不使用延迟订阅有何不同?csharp public ViewModelModel{this.\u model=model;this.whennyvaluex=>x.\u model.Value.ToPropertythis,name of this.Property,out this.\u propertyOAPH,scheduler:RxApp.MainThreadScheduler;}修改了答案,并针对您的顾虑提出了一个可能的解决方案。我看不出Concat操作符在这里有什么帮助。当任何结果可见的值永远不会完成时,将添加到跟踪框架中对该用例的处理