【问题标题】:BehaviorSubject vs PublishSubjectBehaviorSubject 与 PublishSubject
【发布时间】:2023-04-03 16:37:01
【问题描述】:

我正在努力理解关于以下方面的黄金法则(如果有的话):

什么时候使用 BehaviorSubject ?

何时使用 PublishSubject ?

它们的区别很明显

有很多种科目。对于这个特定的要求,PublishSubject 工作得很好,因为我们希望从它停止的地方继续序列。所以假设事件 1,2,3 在 (B) 中发出,在 (A) 连接回来后,我们只想看到 4, 5, 6。如果我们使用 ReplaySubject,我们会看到 [1, 2, 3], 4, 5、6;或者如果我们使用 BehaviorSubject,我们会看到 3、4、5、6 等。 (来源:How to think about Subjects in RxJava (Part 1)

我已经看到Subject 用于(至少)两种上下文,UI 上下文和侦听器上下文。

  • UI 上下文(以 MVVM 为例)

例如here 使用了BehaviorSubject,很清楚他们为什么使用Subject 而不是Observable,但我已将BehaviorSubject 更改为PublishSubject,但应用程序的行为仍然相同。

  • 侦听器上下文

为什么他们将project 字段设为BehaviorSubject 而不是PublishSubject

【问题讨论】:

标签: android rx-java rx-swift reactivex


【解决方案1】:

BehaviourSubject 和 PublishSubject 的区别取决于它们将捕获的数据保留多长时间,例如 PublishSubject 仅保留当前可用的数据并在每个条目上不断更新,而 BehaviourSubject 保留最后插入的数据,因此您可以使用例如在注册表单上确认密码,并作为 PublishSubject 的示例,执行搜索,它必须不断更新数据以提供准确的结果,并且没有太多必要比较正在插入的数据。

作为参考,我留下这两张来自http://reactivex.io/documentation/subject.html的照片

PublishSubject

BehaviourSubject

【讨论】:

    【解决方案2】:

    发布主题:在这里,如果一个学生迟到了教室,他只想从他进入教室的那个时间点开始听。因此,Publish 将是此用例的最佳选择。

    行为主题:在这里,如果一个学生迟到了教室,他想听教授最近(而不是从一开始)教的东西,以便他了解上下文。所以,这里我们将使用 Behavior。

    【讨论】:

    • 喜欢这个描述作为经典技术解释的可理解替代方案。谢谢!
    【解决方案3】:

    PublishSubject:开始为空,仅向订阅者发送新元素。 在创建 Subjectobserver 订阅它之间可能会丢失一个或多个项目,因为 PublishSubject 开始发射创建后立即添加元素。

    BehaviorSubject:它需要一个初始值重播它或最新的元素给新的订阅者。由于 BehaviorSubject 总是发出 最新的元素,因此您无法在不提供默认初始值的情况下创建一个。 BehaviorSubject 有助于描述“随时间变化的价值”。例如,生日事件流是Subject,但一个人的年龄流是BehaviorSubject

    【讨论】:

      【解决方案4】:

      PublishSubjectBehaviorSubject 的主要区别在于后者会记住最后发出的项目。因为BehaviorSubject 在你想要发出states 时非常有用。

      为什么他们将项目字段设为 BehaviorSubject 而不是 PublishSubject ?

      可能是因为他们希望能够使用此方法检索最后发出的项目:

      @Override public @NonNull Observable<Project> project() {
        return this.project;
      }
      

      【讨论】:

      • 它是否只发出状态更改,甚至当状态更改为相同的先前值时?例如,如果我放 onNext('Adam'), onNext('Adam'), onNext('Smith') 会不会只发出 Adam,然后是 Smith?
      • @SaifurRahmanMohsin 见github.com/akarnokd/RxJava2_9/blob/master/src/main/java/io/…。没有检查当前值是否发生了变化。
      猜你喜欢
      • 1970-01-01
      • 2019-09-30
      • 2021-06-18
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多