至少在移动应用程序中,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/