Skip to main content
 首页 » 编程设计

c#之响应式扩展/UI 缓存 Web 请求数据

2024年02月27日35lori

我目前正在通过调用网络服务在 View 模型中获取数据:

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

_loadDataCancel只是一个 IObservable<bool>用作取消信号。

目前,我已经知道,当导航到虚拟机时,会执行加载数据命令。

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

我真正想要做的是让命令总是执行新的获取,但我想有一个额外的可观察对象,我可以在 nav-to 上使用,它会:

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

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

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

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

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

请您参考如下方法:

我觉得有几种方法可以根据更多因素来实现这一点,但这基本上就是您想要的吗?

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