ReactiveUI 和 DynamicData SourceCache 更新问题
ReactiveUI and DynamicData SourceCache update issue
我在我的 Xamarin Forms 项目中使用来自 DynamicData 的 SouceCache 来跟踪来自后端的更改。首先,我从后端获取项目列表,填充 UI,然后等待更改。
问题是,当新的(更新的)对象从后端到达时,我在 _innerCache 集合中找到并更新它,可观察对象没有发出新值,并且 UI 没有更新。
代码被简化了,但它是这样的:
_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);
});
}
}
在我需要这些更改的视图模型中:
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();
我显然遗漏了一些东西,但我仍然不知道是什么,所以如果你看到问题请帮忙:)
没有明显的错误,这些运算符都是常用的。难道是抛出异常?要对此进行测试,您可以添加 Do
语句并调试或写入控制台。例如:
.Do(changes => Console.WriteLine(changes), ex => Console.WriteLine(ex))
.Transform(item => new ItemCellViewModel(item))
.Do(changes => Console.WriteLine(changes), ex => Console.WriteLine(ex))
在每个运算符之前和之后执行此操作可以缩小问题范围。
另外但与您的问题完全无关,永远不要更新这样的来源
foreach (var item in items)
{
_internalSourceCache.Edit(innerCache =>
{
innerCache.AddOrUpdate(item);
});
}
因为它非常低效。在这种情况下,将为每个项目发出一个新的变更集,并将沿着链传输。相反,你应该这样做
_internalSourceCache.Edit(innerCache =>
{
\ doing it this way will only product a single changeset
foreach (var item in items)
innerCache.AddOrUpdate(item);
});
或者如果没有逻辑可以应用,
_internalSourceCache.AddOrUpdate(items);
我发现了问题所在 - Transform 方法是一些自定义扩展方法,未按预期执行。当我引用 DynamicData Trnasform 时,一切都像一个魅力!我真的没想到在 Transform 上按 F12,但是当你不知道该怎么做时......:) 抱歉误报,谢谢!
我在我的 Xamarin Forms 项目中使用来自 DynamicData 的 SouceCache 来跟踪来自后端的更改。首先,我从后端获取项目列表,填充 UI,然后等待更改。
问题是,当新的(更新的)对象从后端到达时,我在 _innerCache 集合中找到并更新它,可观察对象没有发出新值,并且 UI 没有更新。
代码被简化了,但它是这样的:
_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);
});
}
}
在我需要这些更改的视图模型中:
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();
我显然遗漏了一些东西,但我仍然不知道是什么,所以如果你看到问题请帮忙:)
没有明显的错误,这些运算符都是常用的。难道是抛出异常?要对此进行测试,您可以添加 Do
语句并调试或写入控制台。例如:
.Do(changes => Console.WriteLine(changes), ex => Console.WriteLine(ex))
.Transform(item => new ItemCellViewModel(item))
.Do(changes => Console.WriteLine(changes), ex => Console.WriteLine(ex))
在每个运算符之前和之后执行此操作可以缩小问题范围。
另外但与您的问题完全无关,永远不要更新这样的来源
foreach (var item in items)
{
_internalSourceCache.Edit(innerCache =>
{
innerCache.AddOrUpdate(item);
});
}
因为它非常低效。在这种情况下,将为每个项目发出一个新的变更集,并将沿着链传输。相反,你应该这样做
_internalSourceCache.Edit(innerCache =>
{
\ doing it this way will only product a single changeset
foreach (var item in items)
innerCache.AddOrUpdate(item);
});
或者如果没有逻辑可以应用,
_internalSourceCache.AddOrUpdate(items);
我发现了问题所在 - Transform 方法是一些自定义扩展方法,未按预期执行。当我引用 DynamicData Trnasform 时,一切都像一个魅力!我真的没想到在 Transform 上按 F12,但是当你不知道该怎么做时......:) 抱歉误报,谢谢!