2017-08-01 80 views
1

在帶有Mosby庫的MVI中,訪問流中減速器功能之外的狀態的最佳方式是什麼?例如,當您需要爲回收站加載下一頁時,您需要知道最後加載了哪個頁面。 (在樣本應用程序中的最後一頁被保存在裝載機但違背了一個國家POJO的全部目的)在MVI中的減速器功能之外訪問狀態

回答

2

有多種方法可以做到這一點,取決於你的分頁鏈接是如何構建的,你可能不完全需要參考私人的狀態。

例如,假設您可以通過數字訪問下一頁。所以http請求看起來像這樣:http://www.foo.com/feed?page=1下一頁是http://www.foo.com/feed?page=2依此類推。

那麼你基本上可以做這樣的事情:

Observable<Integer> nextPageIntent = intent(YourView::loadNextPageIntent) 
            .scan(1, (previousPage, ignored) -> previousPage + 1); 

Observable<State> state = nextPageIntent.switchMap(page -> backend.loadPage(page).map(...)) 
             .startWith(...) 
             .onErrorReturn(...); 

因此,關鍵是要增加一些「反」。每當YourView::loadNextPageIntent被觸發時,我們在.scan(1, (previousPage, ignored) -> previousPage + 1)中增加page一。因此,這基本上發出1, 2, 3, 4, 5, ...,然後從您的後端加載相應的頁面。

BehaviorSubject<State> state = BehaviorSubject.createDefault(initialState); 
state.switchMap(oldState -> 
     intent(YourView::loadNextPageIntent) 
       .switchMap(ignored -> backend.loadPage(oldState.nextPageUrl) // You can access oldState now 
          .map(...)) 
          .startWith(...) 
          .onErrorReturn(...) 
).subscribe(state); 


subscribeViewState(state, YourView::render) 

但是,如果你真的需要到以前的狀態的基準來決定下一個頁面的網址,你可以稍微不同使用的BehaviorSubject代替.scan()一個運營商這樣的(cretits Paco Estevez)型號的狀態減速

這裏的訣竅是你使用一個Subject來訂閱自己。基本上它與.scan()操作員用來實現減速器非常相似,但是現在您可以參考舊狀態。