我目前正在通过调用web服务来获取视图模型中的数据:
_loadDataCommand = ReactiveCommand.CreateFromObservable(
() => Observable
.StartAsync(ct => _getAllFunction(ct))
.TakeUntil(_loadDataCancel));_loadDataCancel只是一个充当取消信号的IObservable<bool>。
目前,我已经得到了它,这样当vm被导航到时,就会执行load data命令。
对于特别昂贵的获取操作来说,这是有问题的,或者当用户只想离开视图回到他们离开视图的状态(例如列表中的选定项等)时。
我真正想要做的是让它能够使命令始终执行一个新的提取,但是我希望可以在nav-to上使用一个额外的可观察性,这将:
一些研究发现了一些粗略的信息,比如Memoize()和MemoizeAll(),然而,它们似乎在rx中是不可用的(但在System.Interactive中)。
在这里搜索,找到了这样的答案:https://stackoverflow.com/a/12666462/639771,但是在查看了ReactiveUI的主源代码之后,我再也找不到ObservableAsyncMRUCache了。
我遗漏了什么吗?我几乎可以肯定,它会变得足够琐碎,但我完全不知所措。
PS:我知道Akavache是存在的,但是对于我的需要来说,它可能有点太重了。
发布于 2017-02-16 16:28:08
我觉得有几种方法可以做到这一点,这取决于更多的因素,但这基本上是你想要的吗?
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);https://stackoverflow.com/questions/42272915
复制相似问题