Данные из API в ObservableCache с DynamicData с периодическим обновлением - PullRequest
0 голосов
/ 04 марта 2019

Например, у меня есть API для получения списка элементов:

Task<ICollection<Item>> GetItemsAsync();

Я хочу работать с элементами с ObservableCache<Item, int>.

Итак, я создал IItemsService:

IObservableCache<Item, int> Items { get; }

с реализацией:

private IObservableCache<Items, int> _items;

public IObservableCache<Items, int> Items => _items ?? (_items = Create().AsObservableCache().Publish().RefCount());

private IObservable<IChangeSet<Items, int>> Create()
{
    return ObservableChangeSet.Create<Items, int>(cache =>
    {
        var timer = Observable.Interval(TimeSpan.FromSeconds(1))
            .SelectMany(_ => _api.GetItemsAsync())
            .Retry()
            .Subscribe(matchInfos => cache.EditDiff(matchInfos, EqualityComparer<MatchInfo>.Default));

        return timer;
    }, item => item.Id);

Затем я использую этот сервис в модели представления для отображения элементов:

_service.Connect()
    .Transform(item => new ItemViewModel(item))
    .Bind(out items)
    .Subscribe(_ => Initialized = true);

Initialized свойство необходимо показать / скрытьиндикатор загрузки.

У меня есть несколько вопросов:

  1. Это хороший способ?
  2. Мне нужно показать «Нет элементов», когда количество элементов равно0 и Initialized свойство true.Но если сервер вернет 0 элементов - ObservableCache не будет выдавать уведомление, поэтому свойство Initialized будет false.Что я могу сделать с этим?
  3. Когда я удаляю все подписки, таймер не останавливается.Я использую RefCount(), но это не помогает.

1 Ответ

0 голосов
/ 05 марта 2019
  1. Использование ObservableChangeSet.Create является хорошим способом, поскольку он гибок и также допускает логику повторов / повторов.Однако Publish().RefCount() не может работать в вашем примере, так как вы применяете его в кеш, а не к наблюдаемому набору изменений.Вы ищете ленивую загрузку кеша?Если это так, я могу обновить этот ответ несколькими примерами.

  2. Ответ от Гленна правильный.По причинам оптимизации пустые уведомления об изменениях подавляются в динамических данных.Это ограничение в процессе снятия.См. выпуск # 206 .

  3. Существуют юнит-тесты для покрытия утилизации ресурсов, созданных ObservableChangeSet.См. ObservableChangeSetFixture.cs , поэтому я подозреваю, что причина того, что таймер не был расположен, заключается в том, что сам кэш не был удален, и он поддерживает подписку активной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...