Проблема с обновлением ReactiveUI и DynamicData SourceCache - PullRequest
0 голосов
/ 16 марта 2020

Я использую SouceCache из DynamicData в своем проекте Xamarin Forms для отслеживания изменений из бэкэнда. Сначала я получаю список Предметов из бэкэнда, заполняю пользовательский интерфейс и затем жду изменений.

Проблема в том, что когда новый (обновленный) объект прибывает из бэкэнда, я нахожу и обновляю его в коллекции _innerCache, из наблюдаемого не выводится новое значение, и пользовательский интерфейс не обновляется.

Код упрощен, но выглядит примерно так:

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

Я явно что-то упустил, но я все еще не знаю, что, поэтому, пожалуйста, помогите, если вы видите проблему:)

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Я обнаружил, в чем проблема - этот метод Transform был каким-то нестандартным методом расширения, который не работал должным образом. Когда я ссылался на DynamicData, Trnasform все работало как шарм! Мне действительно не пришло в голову F12 на Transform, но когда вы не знаете, что делать дальше ... :) Извините за ложную тревогу, спасибо!

0 голосов
/ 17 марта 2020

В этом нет ничего заведомо неправильного, и все эти операторы обычно используются. Может ли быть так, что создается исключение? Чтобы проверить это, вы можете добавить оператор 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);
    });

, либо, если нет логики c для применения,

    _internalSourceCache.AddOrUpdate(items);
...