【问题标题】:ReactiveUI and DynamicData SourceCache update issueReactiveUI 和 DynamicData SourceCache 更新问题
【发布时间】:2020-03-16 16:53:40
【问题描述】:

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

问题是当新的(更新的)对象从后端到达时,我在 _innerCache 集合中找到并更新它,没有从 observable 发出新值,并且 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();

我显然遗漏了一些东西,但我仍然不知道是什么,所以如果您发现问题,请帮忙:)

【问题讨论】:

    标签: mvvm xamarin.forms dynamic-data reactiveui


    【解决方案1】:

    没有什么明显的错误,所有这些运算符都是常用的。会不会是抛出了异常?要对此进行测试,您可以添加 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);
    

    【讨论】:

    • 谢谢!我将项目更新更改为 _internalSourceCache.AddOrUpdate(items),并在 Transform 之前和之后添加了日志 - 奇怪的是我在 Transform 之前和之后都输入 Do 方法,没有例外,但从来没有在 Transform...
    【解决方案2】:

    我发现问题出在哪里——Transform 方法是一些定制的扩展方法,没有按预期执行。当我引用 DynamicData Trnasform 时,一切都像魅力一样!我真的没有想到 F12 上的 Transform,但是当你不知道该做什么时...... :) 抱歉误报,谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多