函数响应式编程框架RxSwift 学习——Subject

2018-08-20 17:04:36 浏览数 (1)

上一篇写了Observable,这篇文章接着趁热打铁把Subject写了。

关于Subject的定义,在RxSwift的文档中它是这样说的

A Subject is a sort of bridge or proxy that is available in some implementations of ReactiveX that acts both as an observer and as an Observable. Because it is an observer, it can subscribe to one or more Observables, and because it is an Observable, it can pass through the items it observes by reemitting them, and it can also emit new items.

简单的比喻下,Observable像是一个水管,会源源不断的有水冒出来。Subject就像一个水龙头,它可以套在水管上,接受Observable上面的事件。但是作为水龙头,它下面还可以被别的observer给subscribe了。

在RxSwift中,主要有三类Subject:

PublishSubject

它仅仅会发送observer订阅之后的事件,也就是说如果sequence上有.Next 的到来,但是这个时候某个observer还没有subscribe它,这个observer就收不到这条信息,它只会收到它订阅之后发生的事件。

ReplaySubject

它和PublishSubject不同之处在于它不会漏消息。即使observer在subscribe的时候已经有事件发生过了,它也会收到之前的事件序列。

BehaviorSubject

当有observer在订阅一个BehaviorSubject的时候,它首先将会收到Observable上最近发送一个信号(或者是默认值),接着才会收到Observable上会发送的序列。

Variable

Variable是BehaviorSubject的封装,它和BehaviorSubject不同之处在于,不能向Variable发送.Complete.Error,它会在生命周期结束被释放的时候自动发送.Complete

在我上一篇文章中,说到了一个比较常见的一个应用场景,就是tableview滑动加载更多的数据。在这里tableview滑动事件是一个Observable的(RxCocoa提供相应支持), 我的page是一个Variable<Int>类型的属性,它可以订阅tableview上是否需要更改页码,然后page又被负责API请求的对象给订阅了,从而当page变化的同时开始自动请求数据。

0 人点赞