我目前正在实现一个具有view-viewmodel循环依赖关系的模式。虽然它实际上并不依赖,因为他们彼此不了解,但他们所知道的只是有一系列事件和一系列状态。我提出了一个想法,让viewModel实现一个名为toTransformer()
的函数,该函数返回一个ObservableTransformer
,它由两个主题组成,一个事件主题和一个状态主题。
private val eventStream: PublishSubject<MainEvent> = PublishSubject.create()
private val stateSink: BehaviorSubject<MainState> = BehaviorSubject.create()
...
fun asTransformer(): ObservableTransformer<MainEvent, MainState> =
ObservableTransformer {
it.subscribe { eventStream.onNext(it) }
stateSink
}
并且像这样使用
view.events().compose(viewModel.asTransformer()).subscribe { view.render(it) }
问题
修改
这就是事件和国家的关系。
eventStream.map { it.toAction() }
.compose(actionToResult())
.scan (MainState.initial(), reducer())
.subscribe {
stateSink.onNext(it)
}
答案 0 :(得分:1)
我不知道你是否基于此,但杰克沃顿有一个great presentation on this kind of architecture。
这样做可以吗?
总的来说,当然。
此实施可能出现问题。
您可能要注意的一件事是,您实际上有一个大的事件循环。如果您的事件循环死亡,则UI将无响应。正确的错误处理比以前更重要。我确定你上面的代码片段是你真正拥有的简化版本,但是考虑到没有错误处理块,内部订阅中的失败将会冒泡到你的外部订阅,这本身就会失败。此时,UI事件将没有活动订阅。
如果订阅被处理,是否会处理内部订阅?
没有。它不在同一个链中。
这可以改进到更好的形式吗?
特别是考虑到之前的答案,您可能想要摆脱内部订阅,以便它是一个链。一种简单的方法是使用flatMap
而不是订阅。