Например, у меня есть 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
свойство необходимо показать / скрытьиндикатор загрузки.
У меня есть несколько вопросов:
- Это хороший способ?
- Мне нужно показать «Нет элементов», когда количество элементов равно
0
и Initialized
свойство true
.Но если сервер вернет 0 элементов - ObservableCache
не будет выдавать уведомление, поэтому свойство Initialized
будет false
.Что я могу сделать с этим? - Когда я удаляю все подписки, таймер не останавливается.Я использую
RefCount()
, но это не помогает.