rxSwift中的observable和subject之间有什么区别

时间:2017-07-17 09:57:23

标签: ios swift rx-swift

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

3 个答案:

答案 0 :(得分:10)

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

  

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

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

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

  

主题是某种可用的桥梁或代理   ReactiveX 的实现,既充当观察者又充当   的可观察即可。因为它是观察者,所以它可以订阅一个或多个   Observable,因为它是一个Observable,它可以通过   它通过重新发现它们观察的物品,它也可以发出新物品。

但是主题是一个表示 - 在文档中提到 - 可观察和观察者,这意味着主题可能是数据生成者(负责发布要观察的通知或数据使用者(负责接收通知)。

代码段:我建议检查RxSwift For Dummies Part 3以查看可观察对象和主题实用代码。

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

答案 1 :(得分:3)

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

<强>观测量

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

<强>受试者

  • 简单的observable只能发出可以订阅的事件。但是如果我们想在当前的observable(也称为自我观察者)上添加一些值呢?所以我可以说,作为可观察以及观察者的东西被称为主题。

答案 2 :(得分:2)

你有几个答案解释了Observables和Subjects之间的区别,但没有人覆盖你的第二个问题......

  

我什么时候应该使用observable,在什么情况下我应该使用subject?

对于这个问题,这是一个很好的,如果复杂的答案: http://davesexton.com/blog/post/To-Use-Subject-Or-Not-To-Use-Subject.aspx

TL; DR就是这个。尽可能使用Observable,必要时使用Subject。

您需要热门观察时才使用主题,并且没有可观察到的可观察对象。例如,RxCocoa广泛使用Subjects为您创建与特定UI元素绑定的observable。它们主要用于将非Rx代码桥接到Rx代码中,并将生产者连接到消费者,后者必须首先由于某种原因创建后者。