rxSwift 中的 observable 和 subject 有啥区别

Posted

技术标签:

【中文标题】rxSwift 中的 observable 和 subject 有啥区别【英文标题】:What are the differences between observable and subject in rxSwiftrxSwift 中的 observable 和 subject 有什么区别 【发布时间】:2017-07-17 09:57:23 【问题描述】:

observable 和 subject 之间有什么区别。 当我定义一个可观察的类型变量时。它可以发出 onNext、onComplete、onDispose。然而,主题也可以这样做。什么时候应该使用 observable,什么情况下应该使用 subject?

【问题讨论】:

【参考方案1】:

为了理解它们之间的区别,我们应该提一下Observable是:

在 ReactiveX 中,观察者订阅了 Observable。然后 观察者对 Observable 的任何项目或项目序列做出反应 发出。这种模式有利于并发操作,因为它确实 等待 Observable 发射对象时不需要阻塞, 但相反,它以观察者的形式创建了一个哨兵 准备好在 Observable 未来的任何时间做出适当的反应 这样做。

换句话说,observable 是数据生产者(负责发布要观察的通知)。

实际上,Subject 是一种特殊类型的 Observables(您仍然可以像订阅任何其他 observable 一样订阅消息):

Subject 是一种桥接器或代理,在某些情况下可用 ReactiveX 的实现既作为观察者又作为 可观察。因为是观察者,所以可以订阅一个或多个 Observables,并且因为它是一个 Observable,它可以通过 它通过重新发射它们观察到的项目,它也可以发射新项目。

但事情是主题是可观察者和观察者的表示 - 如文档中所述 - 这意味着主题可能是数据生产者(负责发布要观察的通知或数据消费者(负责接收通知)。

另外:要检查主题的类型,您可能需要检查:RxSwift Subject Types。

【讨论】:

Swift Pearls 链接已损坏。似乎该 URL 已被接管,并可能指向网络钓鱼网站。【参考方案2】:

我认为,根据我对这两个主题的了解,我可以这么说,

可观察的

Observable(Rx 的基本部分)是具有一些特殊功能的序列。最重要的特点是异步。 Observables 产生一些事件(即 onNext、onError、onCompleted),称为发射。事件包含一些值(即 Int、Bool、Array 或自定义类型)。

主题

简单的 observable 只能发出可以订阅的事件。但是如果我们想在当前的 observable(也称为 self observer)上添加一些值怎么办。所以我可以简单地说,作为observableobserver的东西叫做subjects。

【讨论】:

【参考方案3】:

您得到了一些解释 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 代码,并将生产者连接到消费者,由于某种原因必须首先创建后者。

【讨论】:

以上是关于rxSwift 中的 observable 和 subject 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift - 一个 Observable 中的多个 Observable 值

RxSwift 从 Observable 序列中的一项获取值

RxSwift 系列

如何测试 RxSwift 变量和 RxCocoa Observable 之间的 UI 绑定?

RxSwift。结合最新。并不是所有的 observables 都发出了

Observable 的 RxSwift 用途