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,但是当你不知道该怎么做时......:) 抱歉误报,谢谢!