2016-04-03 101 views
3

我想找到一种更好的方式来实现类似RxJava中的存储库模式。使用RxJava实现存储库模式

这是我到目前为止有:(采取了一些代码here

public Subscription getData(Observer<Data> observer, boolean refresh) { 
    Subscription sub = null; 

    Data cached = getCachedData(); 
    if(cached != null) { 
     observer.onNext(cached); 
     if(refresh) { 
      sub = requestNetwork().subscribe(observer); 
     } else { 
      observer.onCompleted(); 
     } 
    } else { 
     sub = requestNetwork().subscribe(observer); 
    } 

    return sub; 
} 

基本上它检查是否有缓存存储的数据,如果没有它会发出一个网络请求。它也有refresh布尔参数强制它总是发出网络请求。

问题(或不是),此功能的调用者需要调用它将收到Subscription而不是Observable,我不能再链接。

有没有办法让函数返回Observable但仍然有存储库模式?

+1

见http://blog.danlew.net/2015/06/22/loading-data-from-multiple-sources-with-rxjava/ – akarnokd

+0

啊,我一次打开了那篇文章,但没有使用它,因为它使用了“第一个”,这使得订阅者只能从第一个来源匹配谓词。 我忘了我可以选择** not **通过使用'refresh'参数调用'first'运算符。谢谢! –

回答

1

感谢akarnokd指出我由Dan Lew为this article

我的最终代码:

public Observable<Data> getData(boolean refresh) { 
    Observable<Data> obs = Observable.concat(getCache(), requestNetwork()); 
    if(!refresh) { 
     obs = obs.first(data -> data != null); 
    } 
    return obs; 
} 
+0

但是,当你有一个项目在缓存中,并刷新为真,这将发射两个项目.... –

+0

@TassosBassoukos我认为这是我想要的。该视图将收到两个项目。首先缓存然后再次从网络渲染新的。 –