在MVI中访问reducer函数之外的状态

时间:2017-08-01 17:27:36

标签: android architecture mosby

在使用Mosby库的MVI中,访问流中reducer函数之外的状态的最佳方法是什么?例如,当您需要为回收器加载下一页时,您需要知道最后加载了哪个页面。 (在示例应用程序中,最后一页保存在加载程序中,但这违背了拥有单个状态POJO的全部目的)

1 个答案:

答案 0 :(得分: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(...);

所以诀窍是添加一些&#34;计数器&#34;。每当触发YourView::loadNextPageIntent时,我们会在page中将.scan(1, (previousPage, ignored) -> previousPage + 1)增加一。所以这基本上会发出1, 2, 3, 4, 5, ...,然后从你的后端加载相应的页面。

但是,如果您确实需要引用之前的状态来确定下一页网址,则可以使用BehaviorSubject代替.scan()运算符来对状态缩减器进行略微不同的建模(cretits { {3}}):

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)

这里的诀窍是你使用一个订阅自己的主题。基本上它与.scan()运算符实现减速器的方式非常相似,但现在您可以引用旧状态。