由受试者制成的可观察变压器

时间:2018-01-16 03:39:10

标签: android kotlin rx-java rx-java2

我目前正在实现一个具有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)
    }

1 个答案:

答案 0 :(得分:1)

我不知道你是否基于此,但杰克沃顿有一个great presentation on this kind of architecture

  

这样做可以吗?

总的来说,当然。

  

此实施可能出现问题。

您可能要注意的一件事是,您实际上有一个大的事件循环。如果您的事件循环死亡,则UI将无响应。正确的错误处理比以前更重要。我确定你上面的代码片段是你真正拥有的简化版本,但是考虑到没有错误处理块,内部订阅中的失败将会冒泡到你的外部订阅,这本身就会失败。此时,UI事件将没有活动订阅。

  

如果订阅被处理,是否会处理内部订阅?

没有。它不在同一个链中。

  

这可以改进到更好的形式吗?

特别是考虑到之前的答案,您可能想要摆脱内部订阅,以便它是一个链。一种简单的方法是使用flatMap而不是订阅。