2017-02-16 7 views
0

я в настоящее время выборки данных в модели представления, призывая к веб-сервиса:Реактивные Extensions/UI данные запроса кэша веб-

_loadDataCommand = ReactiveCommand.CreateFromObservable(
     () => Observable 
      .StartAsync(ct => _getAllFunction(ct)) 
      .TakeUntil(_loadDataCancel)); 

_loadDataCancel это просто IObservable<bool>, который действует как сигнал отмены.

В настоящее время у меня есть это так, что когда vm перемещается, выполняется команда загрузки данных.

Это очень проблематично для особо дорогостоящих операций по извлечению или когда пользователь просто хочет уйти и вернуться в состояние, в котором они покинули представление (например, выбранный элемент в списке и т. Д.).

То, что я действительно хочу, чтобы быть в состоянии сделать, это иметь его так, что команда всегда выполняет свежие выборки, но я хочу, чтобы иметь дополнительный наблюдаемым я могу использовать на нав-к, которая:

  1. Получение данных из кэша, если присутствует
  2. Используйте LoadData наблюдаемым, если данные нет (и вставить в кэш)

некоторых исследований оказались беглой информация вокруг вещей, как Memoize() и MemoizeAll(), однако они не доступны в rx (но находятся в System.Interactive).

Некоторые поиски здесь, ответили на этот вопрос: https://stackoverflow.com/a/12666462/639771, но, посмотрев на главный источник для ReactiveUI, теперь я больше не могу найти ObservableAsyncMRUCache.

Есть ли что-то, что мне не хватает? Я почти уверен, что это будет достаточно тривиально, но я полностью в недоумении.

PS: Я знаю, что Akavache существует, но он может быть немного слишком тяжелым для моих нужд.

ответ

2

Я чувствую, что есть несколько способов сделать это, только в зависимости от большего количества факторов, но это в основном то, что вы хотите?

IObservable<Object> GetFromServer() 
{ 
     //Get From Server 
     //Store in Cache 
} 
IObservable<Object> GetFromCache() 
{ 
     return //returns something from cache or just return null; 
} 
... 
GetFromCache() 
.SelectMany(result => 
    { 
     if (result == null) 
      return GetFromServer(); 


     return Observable.Return(result); 
    }); 

Есть варианты, где можно хранить результат как часть наблюдаемых, но, как это он реализован вид зависит от того, как вы хотели истечь тайник .. Например, вы могли бы просто создать связное наблюдаемым, что только один раз вызывает сервер, а затем просто воспроизводит результат любым абонентам

GetFromServer() 
    .Replay(1); 
Смежные вопросы