【问题标题】:Why is it not possible to map BehaviorSubject to another BehaviorSubject为什么不能将 BehaviorSubject 映射到另一个 BehaviorSubject
【发布时间】:2018-01-20 20:27:00
【问题描述】:

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

有时它只想转换 BehaviorSubject 而不订阅它。例如。如果有类,它充当几个转换后的BehaviorSubject 和潜在订阅者之间的中间层。

我在这里遇到的问题,至少在 RxJava2 中,是在 BehaviorSubject 上应用运算符总是返回 Observable。所以我的中间层不能再提供BehaviorSubject的api了。

一个可能的解决方案是创建新的BehaviorSubjects 并将它们订阅到原来的BehaviorSubject,但总体而言这似乎是一个坏主意,也许我现在不想订阅但只能按需订阅,即当我的中间层的用户真的需要这些主题吗?

在我的例子中,上下文是一个具有 MVVM 模式的 Android 应用程序,其中视图模型将 BehaviorSubject 暴露给视图,这些视图大部分来自应用程序中的另一个 BehaviorSubjects。我目前在视图模型中订阅,但我想改进这一点,因为视图模型不是真正的消费者,不应该订阅任何东西——当视图真正需要他们的东西时,应该激活主题。

不,我不能在视图模型中只使用 Observable,因为有单元测试和一些其他调用会检查某个点的值,而仅使用 Observable 是无法完成的。

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

【问题讨论】:

    标签: android mvvm rx-java2


    【解决方案1】:

    它不会正确组合,运算符是最终方法,以避免方法分派问题。另外,如果您在 onNext 转换后的主题同时 onNext 原始主题,您将为最终消费者创建多个入口点,并且可能违反 Observable 合同。

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

    不,我不能在视图模型中只使用 Observable,因为有单元测试和一些其他调用会检查某个点的值,而仅使用 Observable 是无法做到的。

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

    否则,我不清楚您的设计,因为它过于关注主题而不是某些事件的单一发起者。

    【讨论】:

    • 谢谢。现在更清楚了。我认为blockingFirst 在某些情况下不是替代品,例如替换使用默认值初始化的行为主题......这也不会导致可能的可观察源激活(同时阻塞当前线程)?
    • 另外:例如,在 iOS 中,有响应式 cocoa 和一个名为 Property 的类,将运算符应用于属性只需返回另一个 Property(属性本质上是一个带有“值”字段的可观察对象,类似于BehaviorSubject)。我正在将业务逻辑组件移植到 Android ......我只是想知道为什么像这样的构造在那里可用而不在这里(这不是批评,我不知道内部结构)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2021-07-20
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多