上一篇寫了Observable韭脊,這篇文章接著趁熱打鐵把Subject寫了。
關(guān)于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像是一個(gè)水管,會源源不斷的有水冒出來精续。Subject就像一個(gè)水龍頭酿炸,它可以套在水管上糙申,接受Observable上面的事件叨叙。但是作為水龍頭锭弊,它下面還可以被別的observer給subscribe了。
在RxSwift中擂错,主要有三類Subject:
PublishSubject
它僅僅會發(fā)送observer訂閱之后的事件味滞,也就是說如果sequence上有.Next 的到來,但是這個(gè)時(shí)候某個(gè)observer還沒有subscribe它钮呀,這個(gè)observer就收不到這條信息剑鞍,它只會收到它訂閱之后發(fā)生的事件。
ReplaySubject
它和PublishSubject不同之處在于它不會漏消息爽醋。即使observer在subscribe的時(shí)候已經(jīng)有事件發(fā)生過了蚁署,它也會收到之前的事件序列。
BehaviorSubject
當(dāng)有observer在訂閱一個(gè)BehaviorSubject的時(shí)候蚂四,它首先將會收到Observable上最近發(fā)送一個(gè)信號(或者是默認(rèn)值)光戈,接著才會收到Observable上會發(fā)送的序列。
Variable
Variable是BehaviorSubject的封裝遂赠,它和BehaviorSubject不同之處在于久妆,不能向Variable發(fā)送.Complete和.Error,它會在生命周期結(jié)束被釋放的時(shí)候自動發(fā)送.Complete解愤。
在我上一篇文章中镇饺,說到了一個(gè)比較常見的一個(gè)應(yīng)用場景乎莉,就是tableview滑動加載更多的數(shù)據(jù)送讲。在這里tableview滑動事件是一個(gè)Observable的(RxCocoa提供相應(yīng)支持), 我的page是一個(gè)Variable<Int>
類型的屬性,它可以訂閱tableview上是否需要更改頁碼惋啃,然后page又被負(fù)責(zé)API請求的對象給訂閱了哼鬓,從而當(dāng)page變化的同時(shí)開始自動請求數(shù)據(jù)。