Mvvm ReactiveUI和DynamicDataSourceCache更新问题
在我的Xamarin表单项目中,我正在使用DynamicATA中的SouceCache跟踪后端的更改。首先,我从后端获取项目列表,填充UI,然后等待更改 问题是,当新的(更新的)对象从后端到达时,我在一个_innerCache集合中找到并更新它,observable不会发出新的值,UI也不会更新 代码被简化了,但它是这样的:Mvvm ReactiveUI和DynamicDataSourceCache更新问题,mvvm,xamarin.forms,dynamic-data,reactiveui,Mvvm,Xamarin.forms,Dynamic Data,Reactiveui,在我的Xamarin表单项目中,我正在使用DynamicATA中的SouceCache跟踪后端的更改。首先,我从后端获取项目列表,填充UI,然后等待更改 问题是,当新的(更新的)对象从后端到达时,我在一个_innerCache集合中找到并更新它,observable不会发出新的值,UI也不会更新 代码被简化了,但它是这样的: _internalSourceCache = new SourceCache<Item, string>(o => o.Id); public IObs
_internalSourceCache = new SourceCache<Item, string>(o => o.Id);
public IObservable<IChangeSet<Item, string>> Connect() => _internalSourceCache.Connect();
private void OnItemUpdated(List<Item> items)
{
foreach (var item in items)
{
_internalSourceCache.Edit(innerCache =>
{
innerCache.AddOrUpdate(item);
});
}
}
\u internalSourceCache=newsourcecache(o=>o.Id);
public IObservable Connect()=>\u internalSourceCache.Connect();
已更新的私人文件(列表项)
{
foreach(项目中的var项目)
{
_internalSourceCache.Edit(innerCache=>
{
innerCache.AddOrUpdate(项);
});
}
}
在需要进行这些更改的视图模型中:
itemsService
.Connect()
.Transform(item=>
{
return new ItemCellViewModel(item);
}, (_, n) => _ = new ItemCellViewModel(n))
.Sort(SortExpressionComparer<ItemCellViewModel>.Descending(t => t.Status))
.DisposeMany()
.ObserveOn(MainThreadScheduler)
.Bind(out _items)
.Subscribe();
itemsService
.Connect()
.Transform(项=>
{
返回新的ItemCellViewModel(item);
},(u,n)=>u=新项目CellViewModel(n))
.Sort(SortExpressionComparer.Descending(t=>t.Status))
.DisposeMany()
.ObserveOn(MainThreadScheduler)
.绑定(输出项目)
.Subscribe();
我显然遗漏了一些内容,但我仍然不知道是什么,因此如果您发现问题,请提供帮助:)没有明显错误,所有这些运算符都是常用的。是否会引发异常?要对此进行测试,您可以添加
Do
语句并调试或写入控制台。例如:
.Do(changes=>Console.WriteLine(changes),ex=>Console.WriteLine(ex))
.Transform(项=>新项CellViewModel(项))
.Do(changes=>Console.WriteLine(changes),ex=>Console.WriteLine(ex))
在每个操作员之前和之后执行此操作将允许您缩小问题范围
此外,但与您的问题完全无关,永远不要更新这样的来源
foreach(项目中的变量项目)
{
_internalSourceCache.Edit(innerCache=>
{
innerCache.AddOrUpdate(项);
});
}
因为它是超低效的。在这种情况下,将为每个项目发出一个新的变更集,并沿链传输。相反,你应该这样做
\u internalSourceCache.Edit(innerCache=>
{
\\这样做只会产生一个变更集
foreach(项目中的var项目)
innerCache.AddOrUpdate(项);
});
或者如果没有适用的逻辑
\u internalSourceCache.AddOrUpdate(项目);
我发现问题出在哪里-转换方法是一些定制的扩展方法,没有按预期执行。当我引用dynamicata Trnasform时,一切都像一个符咒!我真的没有想到F12的转换,但当你不知道该怎么做更多…:)抱歉误报,谢谢 谢谢!我将items update更改为_internalSourceCache.AddOrUpdate(items),并在转换前后添加了日志-奇怪的是,我在转换前后无一例外地输入Do方法,但从未在转换中。。。