至少在移动应用程序中,BehaviorSubject经常用于对属性进行建模-它具有当前值,可以随时查询并观察它。

有时只需要转换BehaviorSubject而不必订阅它。例如。如果存在类,则充当几个转换的BehaviorSubject和潜在订户之间的中间层。

我在这里遇到的问题,至少在RxJava2中,是在BehaviorSubject上应用运算符始终返回Observable。因此,我的中间层不再提供BehaviorSubject的api。

一种可能的解决方案是创建新的BehaviorSubject并将它们订阅到原始的BehaviorSubject,但这总体上是个坏主意,也许我现在不想订阅,而只是按需订阅,即当我的中间层用户实际需要时这些科目?

在我的情况下,上下文是具有MVVM模式的Android应用程序,其中 View 模型将BehaviorSubject公开给 View ,这些 View 大部分是从应用程序中的另一个BehaviorSubject派生的。我目前使用 View 模型进行订阅,但是由于 View 模型并不是真正的消费者并且不应该订阅任何东西,因此我想改进这一点-当 View 实际需要它们时,应该激活主题。

不,我不能在 View 模型中仅使用Observable,因为存在单元测试和其他一些调用来检查某个点的值,而仅使用Observable不能完成。

我的主要问题是,为什么不能简单地将BehaviorSubject转换为另一个BehaviorSubject。同样令人高兴的是,在所描述的上下文中使用BehaviorSubject的推荐方法是什么。

最佳答案

它不会正确组合,运算符(operator)是避免方法分派(dispatch)问题的 final方法。另外,如果您同时在下一个转换后的主题上,同时在下一个原始主题上,则您将为最终用户创建多个入口点,并且有可能违反可观察契约(Contract)。

但是您可以将多个主题合并在一起,每个主题都由其各自的事件驱动,最终用户将正确接收事件。



您是否尝试过blockingFirst()从从那些原始BehaviorSubject开始的链中获取当前值?

否则,您的设计对我来说并不明确,因为它过于专注于主题,而不是某些事件的唯一发起者。

关于android - 为什么无法将BehaviorSubject映射到另一个BehaviorSubject,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45650120/

10-09 12:56