【发布时间】:2017-07-17 09:57:23
【问题描述】:
observable 和 subject 之间有什么区别。 当我定义一个可观察的类型变量时。它可以发出 onNext、onComplete、onDispose。然而,主题也可以这样做。什么时候应该使用 observable,什么情况下应该使用 subject?
【问题讨论】:
observable 和 subject 之间有什么区别。 当我定义一个可观察的类型变量时。它可以发出 onNext、onComplete、onDispose。然而,主题也可以这样做。什么时候应该使用 observable,什么情况下应该使用 subject?
【问题讨论】:
为了理解它们之间的区别,我们应该提一下Observable是:
在 ReactiveX 中,观察者订阅了 Observable。然后 观察者对 Observable 的任何项目或项目序列做出反应 发出。这种模式有利于并发操作,因为它确实 等待 Observable 发射对象时不需要阻塞, 但相反,它以观察者的形式创建了一个哨兵 准备好在 Observable 未来的任何时间做出适当的反应 这样做。
换句话说,observable 是数据生产者(负责发布要观察的通知)。
实际上,Subject 是一种特殊类型的 Observables(您仍然可以像订阅任何其他 observable 一样订阅消息):
Subject 是一种桥接器或代理,在某些情况下可用 ReactiveX 的实现既作为观察者又作为 可观察。因为是观察者,所以可以订阅一个或多个 Observables,并且因为它是一个 Observable,它可以通过 它通过重新发射它们观察到的项目,它也可以发射新项目。
但事情是主题是可观察者和观察者的表示 - 如文档中所述 - 这意味着主题可能是数据生产者(负责发布要观察的通知或数据消费者(负责接收通知)。
另外:要检查主题的类型,您可能需要检查:RxSwift Subject Types。
【讨论】:
我认为,根据我对这两个主题的了解,我可以这么说,
可观察的
主题
【讨论】:
您得到了一些解释 Observables 和 Subjects 之间区别的答案,但没有人涵盖您的第二个问题...
什么时候应该使用 observable,什么情况下应该使用 subject?
以下是对该问题的一个很好的但复杂的答案: http://davesexton.com/blog/post/To-Use-Subject-Or-Not-To-Use-Subject.aspx
TL;DR 就是这样。尽可能使用 Observable,必要时使用 Subject。
当你需要一个热的 observable 并且还没有一个 observable 可以使用时,你可以使用 Subject。例如,RxCocoa 广泛使用 Subjects 来为您创建与特定 UI 元素相关联的 observables。它们主要用于将非 Rx 代码桥接到 Rx 代码,并将生产者连接到消费者,由于某种原因必须首先创建后者。
【讨论】: