gpt4 book ai didi

mvvm - ReactiveUI和DynamicData SourceCache更新问题

转载 作者:行者123 更新时间:2023-12-03 10:31:34 24 4
gpt4 key购买 nike

我正在Xamarin Forms项目中使用DynamicData中的SouceCache来跟踪后端的更改。首先,我从后端获取项目列表,填充UI,然后等待更改。

问题是,当new(updated)对象从后端到达时,我在_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);
});
}
}

在需要这些更改的 View 模型中:
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))

在每个运算符(operator)之前和之后执行此操作可以缩小问题范围。

此外,但与您的问题完全无关,切勿更新此类源

    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);

关于mvvm - ReactiveUI和DynamicData SourceCache更新问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60710049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com