2016-04-03 140 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我認爲這是我想要的。該視圖將收到兩個項目。首先緩存然後再次從網絡渲染新的。 –