【问题标题】:Reactive Extensions / UI cache web request dataReactive Extensions / UI 缓存 Web 请求数据
【发布时间】:2017-02-16 11:39:45
【问题描述】:

我目前正在通过调用 Web 服务来获取视图模型中的数据:

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

_loadDataCancel 只是一个充当取消信号的IObservable<bool>

目前,我已经有了它,以便在导航到 vm 时执行加载数据命令。

这对于特别昂贵的获取操作来说是有问题的,或者当用户只想导航并返回他们离开视图的状态时(例如,列表中的选定项目等)。

我真正想要做的是拥有它,以便命令 always 执行新的提取,但我希望有一个额外的 observable 我可以在 nav-to 上使用,它会:

  1. 从缓存中检索数据(如果存在)
  2. 如果数据不存在,则使用 LoadData observable(并插入缓存)

一些研究发现了关于 Memoize()MemoizeAll() 之类的粗略信息,但是它们似乎在 rx 中不可用(但在 System.Interactive 中)。

在这里进行一些搜索,找到了这个答案:https://stackoverflow.com/a/12666462/639771,但是在查看 ReactiveUI 的主源代码之后,我现在再也找不到 ObservableAsyncMRUCache

我有什么遗漏吗?我几乎可以肯定它会变得微不足道,但我完全不知所措。

PS:我知道 Akavache 存在,但它可能对我的需求来说有点太重了。

【问题讨论】:

    标签: c# caching system.reactive observable reactiveui


    【解决方案1】:

    我觉得有几种方法可以实现这一点,这取决于更多因素,但这基本上是你想要的吗?

    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);
      });
    

    您可以将结果存储为 observable 的一部分,但实现方式取决于您希望如何使缓存过期。例如,您可以创建一个仅调用服务器一次的连接的 observable然后将结果重播给任何订阅者

     GetFromServer()
       .Replay(1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-16
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 2013-02-05
      相关资源
      最近更新 更多