上一篇寫了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
它僅僅會發(fā)送observer訂閱之后的事件,也就是說如果sequence上有.Next 的到來,但是這個時候某個observer還沒有subscribe它,這個observer就收不到這條信息,它只會收到它訂閱之后發(fā)生的事件。
ReplaySubject
它和PublishSubject不同之處在于它不會漏消息。即使observer在subscribe的時候已經有事件發(fā)生過了,它也會收到之前的事件序列。
BehaviorSubject
當有observer在訂閱一個BehaviorSubject的時候,它首先將會收到Observable上最近發(fā)送一個信號(或者是默認值),接著才會收到Observable上會發(fā)送的序列。
Variable
Variable是BehaviorSubject的封裝,它和BehaviorSubject不同之處在于,不能向Variable發(fā)送.Complete和.Error,它會在生命周期結束被釋放的時候自動發(fā)送.Complete。
在我上一篇文章中,說到了一個比較常見的一個應用場景,就是tableview滑動加載更多的數(shù)據(jù)。在這里tableview滑動事件是一個Observable的(RxCocoa提供相應支持), 我的page是一個Variable<Int>
類型的屬性,它可以訂閱tableview上是否需要更改頁碼,然后page又被負責API請求的對象給訂閱了,從而當page變化的同時開始自動請求數(shù)據(jù)。