- metaData-createDate:2019-12-23 05:34:35.120341
:metaData-end
Subject
-
Subject可以看成是一個橋樑或者代理,在某些ReactiveX實現中(如RxJava),它同時充當了Observer和Observable的角色。因爲它是一個Observer,它可以訂閱一個或多個Observable;又因爲它是一個Observable,它可以轉發它收到(Observe)的數據,也可以發射新的數據
-
Subject是一個抽象類,不能通過new來實例化Subject,所以Subject有四個實現類,分別爲
- AsyncSubject
- BehaviorSubject
- PublishSubject
- ReplaySubject
AsyncSubject
Observer會接收AsyncSubject的`onComplete()之前的最後一個數據,如果因異常而終止,AsyncSubject將不會釋放任何數據,但是會向Observer傳遞一個異常通知
BehaviorSubject
Observer會接收到BehaviorSubject被訂閱之前的最後一個數據,再接收其他發射過來的數據,如果BehaviorSubject被訂閱之前沒有發送任何數據,則會發送一個默認數據。
(注意跟AsyncSubject的區別,AsyncSubject要手動調用onCompleted(),且它的Observer會接收到onCompleted()前發送的最後一個數據,之後不會再接收數據,而BehaviorSubject不需手動調用onCompleted(),它的Observer接收的是BehaviorSubject被訂閱前發送的最後一個數據,兩個的分界點不一樣,且之後還會繼續接收數據。)
PublishSubject
PublishSubject比較容易理解,相對比其他Subject常用,它的Observer只會接收到PublishSubject被訂閱之後發送的數據
ReplaySubject
ReplaySubject會發射所有數據給觀察者,無論它們是何時訂閱的。也有其它版本的ReplaySubject,在重放緩存增長到一定大小的時候或過了一段時間後會丟棄舊的數據。