前语

在专栏的前两篇分别介绍了ReactiveX和Observable,本篇首要介绍一下呼应式编程里边另一个非常重要的概念Subject。Subject直译过来是主题或科目的意思,这种直译过来让人很难理解其在呼应编程中的真正意义,所以请跟从笔者的脚步,从根底概念一步一步的学习呼应式编程。

Subject

Subject是一种桥或代理,在ReactiveX的某些完结中可用,既充当Observer又充当Observable。由于它是一个Observer,它能够订阅一个或多个Observable;由于它是Observable的,它能够宣布新的项目,它还能够将观察到的项目从头发布。

由于Subject订阅了Observable,它将触发该Observable开端发射项目(假如该Observble是“冷”的,也就是说,假如它在开端发射项目之前等待订阅)。这能够使生成的Subject将原始“冷”Observable变成“热”Observable。

Subject的种类

有四种Subject是为特定的用例而设计的。这些并非在一切完结中都可用,有些完结运用其他命名约定(例如,在RxScala中,将这里的“Subject”称为“PublishSubject”):

AsyncSubject

第三篇 ReactiveX之Subject
AsyncSubject宣布由源Observable宣布的最后一个值(并且仅宣布最后一个),并且仅在该源Observble完结之后宣布。(假如源Observable没有宣布任何值,那么AsyncSubject也会在不宣布任何值的情况下完结。)

第三篇 ReactiveX之Subject
它还将向任何后续观察者宣布相同的最终值。但是,假如源Observable因过错而停止,AsyncSubject将不会宣布任何项,而是简略地从源Observble传递过错告诉。

BehaviorSubject

第三篇 ReactiveX之Subject
当观察者订阅BehaviorSubject时,它首先宣布源Observable最近宣布的项目(假如没有宣布,则为种子/默认值),然后持续宣布源observer稍后宣布的任何其他项目。

第三篇 ReactiveX之Subject
但是,假如源Observable因过错而停止,BehaviorSubject将不会向后续的观察者宣布任何项,而是简略地传递来自源Observble的过错告诉。

PublishSubject

第三篇 ReactiveX之Subject
PublishSubject只向观测者宣布由源Observable在订阅时刻之后宣布的那些项。

请注意,PublishSubject可能会在创立后立即开端发送项目(除非您已采取措施防止这种情况产生),因此在创立Subject和观察者订阅它之间,一个或多个项目可能会丢掉。假如您需要保证从源Observable交给一切项目,您需要运用Create形成Observable,以便手动从头引进“冷”Observable行为(查看一切观察者在开端宣布项目之前是否现已订阅),或者改用ReplaySubject。

第三篇 ReactiveX之Subject
假如源Observable因过错而停止,那么PublishSubject将不会向后续的观察者宣布任何项,而是简略地传递来自源Observble的过错告诉。

ReplaySubject

第三篇 ReactiveX之Subject
ReplaySubject将源Observable宣布的一切项目发送给任何观察者,无论观察者何时订阅。 还有一些版本的ReplaySubject,一旦重放缓冲区有超过特定巨细的风险,或者当项目开始宣布后经过指定的时刻跨度时,就会丢弃旧项目。 假如您运用ReplaySubject作为观察者,请注意不要从多个线程调用其onNext办法(或其其他on办法),由于这可能会导致重合(非顺序)调用,这违反了Observable约定,并在生成的Subject中造成应先重放哪个项目或告诉的歧义。

总结

假如没有呼应式编程根底的小伙伴,独自看本篇文章可能会比较难理解,所以笔者在这里强烈建议结合本专栏前两篇的文章一同看,这样理解的会比较深刻一些。