【问题标题】:Observable transformers made of Subjects由 Subjects 组成的 Observable Transformers
【发布时间】:2018-01-16 03:39:10
【问题描述】:

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

【问题讨论】:

  • 状态是如何从事件中导出的?不清楚你是怎么处理的?
  • 嗨@yosriz,请看编辑

标签: android kotlin rx-java rx-java2


【解决方案1】:

我不知道你是否以此为依据,但 Jake Wharton 有一个 great presentation on this kind of architecture

这样可以吗?

一般来说,当然。

这个实现会出现什么问题。

您可能需要注意的一件事是,您实际上有一个大事件循环。如果您的事件循环终止,UI 将无响应。正确的错误处理比以前更重要。我确信您上面的代码 sn-ps 是您真正拥有的代码的简化版本,但请考虑,如果没有错误处理块,您的内部订阅中的失败将冒泡到您的外部订阅,而外部订阅本身将失败。此时,不会有 UI 事件的活动订阅。

如果订阅被释放,内部订阅会被释放吗?

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

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

特别是考虑到前面的答案,您可能希望摆脱内部订阅,使其成为一条链。一个简单的方法是使用flatMap 而不是订阅。

【讨论】:

  • 是的,它基于 jake 的演示文稿。错误处理在actionToResult() 内部。我小心地将onErrorReturn() 放在每个动作子transformer(构成我的主要transformeractionToResult())上以发出ErrorResult,而不是传播Exceptions。谢谢,你说得对,'flatMap()我怎么会忘记。非常感谢。
  • fun asTransformer(): ObservableTransformer&lt;MainEvent, MainState&gt; = ObservableTransformer { it.flatMap { eventStream.onNext(it) stateSink } }
  • 我现在遇到问题了。我没有支持文档,但是,当 BehaviorSubject 放在 flatMap() 中时。它不会发出最后发出的数据。
  • 操作,更正。行为主题运行良好,但在每次发射中,都会添加新订阅
  • 你不想flatMaponNextflatMap 到实际流。我没有仔细考虑过你的具体实现,但我怀疑PublishSubjectBehaviorSubject 不一定是你需要的类。
猜你喜欢
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
  • 2019-03-05
  • 2023-03-13
相关资源
最近更新 更多