阅读了Hannes Dorfmann的文章MODEL-VIEW-INTENT之后,我使用MVI模式设计了我的应用程序。
我有两个可重用的片段,BarFragment和ContentFragment。我的活动由这两个片段组成。
数据流为:
步骤1:changeKeywordIntent()方法从BarFragment的搜索视图中收集用户的输入。
override fun changeKeywordIntent(): Observable<String?> {
return RxSearchView.queryTextChangeEvents(view!!.search)
.filter { it.isSubmitted }
.map { it.queryText().toString() }
}
第2步:要重用该片段,不直接通过render()方法订阅该意图。
在收到此意图后,演示者首先将PartialViewState.ChangeKeyword(keyword)对象发送给partialViewStateSubject。此部分视图状态将被还原为ViewState,然后由所有MvpView的render()方法使用。即,视图将在适当位置显示该关键字。
这就像广播一样。
呈现PartialViewState.ChangeKeyword(keyword)对象之后,演示者调用业务逻辑,然后发出从PartialViewState.Loading()对象开始的PartialViewState.ContentFirstPage(response.body())。
我的问题是在此步骤中,可以调用哪个RxJava2方法来确保在第二个可观察对象发出之前,第一个可观察对象已预订?哪种方法可以创建第二个可观察的对象?
intent(EmployeesBarView::changeKeywordIntent).flatMap { keyword ->
Observable.concat(
Observable.just(EmployeesScenarioPartialViewState.ChangeKeyword(keyword) as EmployeesScenarioPartialViewState),
Observable.someMethod {
// to ensure viewStateSubject.value is the value after PartialViewState.ChangeKeyword(keyword) has been subscribed, I don't know which method I should call
Observable.just(viewStateSubject.value).flatMap { viewState ->
EmployeeStub.getInstance(activity.baseContext).query(toFilterLogicExpr(viewState.keyword), toOrderByListExpr(viewState.orderBy), toRangeExpr(0, viewState.pageSize), null).toObservable()
.map { response -> EmployeesScenarioPartialViewState.ContentFirstPage(response.body()) as EmployeesScenarioPartialViewState }
.startWith(EmployeesScenarioPartialViewState.Loading())
.onErrorReturn { error -> EmployeesScenarioPartialViewState.Error(error.message) }
}
})
}.subscribe(partialViewStateSubject::onNext).addTo(compositeDisposable)
第3步:收到PartialViewState对象后,将其简化为ViewState对象,然后将ViewState对象推送到viewStateSubject。关键代码是
employeesScenarioViewStatePartialSubject
.scan(initialEmployeesScenarioViewState(), ::reduceEmployeesScenarioViewState)
.subscribe(employeesScenarioViewStateSubject::onNext)
.addTo(compositeDisposable)
第4步:所有演示者都通过bindIntents()方法订阅viewStateSubject
subscribeViewState(viewStateSubject.observeOn(AndroidSchedulers.mainThread())) { obj, state -> obj.render(state) }
第5步:呈现viewState对象,此问题中的代码可以跳过。
所以我的问题在第2步中,有人可以在RxJava2上帮助我处理该代码吗?谢谢。
答案 0 :(得分:0)
使用:
.flatMap{
Observable.fromCallable{events.viewState}
.flatMap{viewState ->......}
}.subscribe(partialViewStateSubject::onNext).addTo(compositeDisposable)