0

阅读了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() 方法订阅意图。

收到意图后,演示者首先向 partialViewStateSubject 发出 PartialViewState.ChangeKeyword(keyword) 对象。这个部分视图状态将被简化为 ViewState,然后被所有 MvpView 的 render() 方法使用。IE,视图将在适当的位置显示该关键字。

这就像一个广播。

在渲染 PartialViewState.ChangeKeyword(keyword) 对象后,演示者调用业务逻辑,然后发出 PartialViewState.ContentFirstPage(response.body()) 以 PartialViewState.Loading() 对象开始。

我的问题是在这一步中,调用哪个 RxJava2 方法可以确保在第二个 observable 发出之前,第一个 observable 被订阅?以及创建第二个 observable 的方法是什么?

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)

第三步:当接收到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) }

第五步:渲染viewState对象,本题代码可以跳过。

所以我的问题是在第 2 步中,有人可以用 RxJava2 帮助我处理该代码吗?谢谢你。

4

1 回答 1

0

Use :

.flatMap{
    Observable.fromCallable{events.viewState}
      .flatMap{viewState ->......}
}.subscribe(partialViewStateSubject::onNext).addTo(compositeDisposable)
于 2018-12-19T03:56:33.950 回答