Subject創(chuàng)建訂閱Source
PublishSubject 最普通的subject,對它訂閱的訂閱者只會收到,后面發(fā)的值。如果對一個Complete/error的subject訂閱,會馬上收到complete/error。
BehaviorSubject? 它的訂閱者在訂閱的時候會收到上一個event( error、complete、next)。創(chuàng)建時候需要一個初始值。
ReplaySubject? 創(chuàng)建的時候用creat(buffferSize:Int)設(shè)置緩存的大小, 緩存的只緩存next。它的訂閱者,在訂閱的時候會馬上收到緩存的next。如果訂閱源是Complete/error,那么還會收到Complete/error。
Variable 是對behaviorSubject的封裝。和behaviorSubject一樣,創(chuàng)建提供一個初始值,它的訂閱者也會馬上收到上一個event。
1.不同的是它不需要手動complete(),當(dāng)Variable銷毀的時候系統(tǒng)會自動調(diào)用complete。2.放送event不用onNext(),而是通過對其屬性value賦值
變換操作符
buffer ?方法作用是緩沖組合,第一個參數(shù)是緩沖時間,第二個參數(shù)是緩沖個數(shù),第三個參數(shù)是線程。訂閱者收到的是一個數(shù)組。如果 緩存時間1S,個數(shù) 3。那么每緩沖3個就發(fā)出,如果一秒內(nèi)不足3個也發(fā)送,一個都不用就發(fā)送[]。
window ? window操作符和??buffer十分相似。不過?buffer?是周期性的將緩存的元素集合發(fā)送出來,而?window周期性將元素集合以O(shè)bservable?的形態(tài)發(fā)送出來。
map? 很熟
flatMap flatMap操作符會對Observable的每一個元素轉(zhuǎn)換成Observables,然后這些Observables的元素合并后再發(fā)送出來。即又將其“flat”降維成一個Observable序列
flatMapLatest flatMapLatest與?flatMap的唯一區(qū)別是:flatMapLatest只會接收最新 value的事件。
concatMap concatMap與??flatMap的唯一區(qū)別是:當(dāng)前一個?observable?元素發(fā)送完畢后,后一個observable?才可以開始發(fā)出元素。或者說等待前一個??observable產(chǎn)生完成事件后,才對后一個?observable?進行訂閱。
scan 就是先給一個初始值,然后不斷的拿前一個的結(jié)果和最新的值進行處理操作。
groupBy 就是將源Observable分解為多個子Observable,然后將這些子Observable發(fā)送出來。
過濾操作符
filter 去除不滿足給定條件的事件
distinctUntilChanged 過濾連續(xù)重復(fù)的事件
single 限制只發(fā)送一次事件,或者滿足條件的第一個事件。如果存在有多個事件或者沒有事件都發(fā)發(fā)出一個error事件。如果只有一個事件,則不會發(fā)出error事件
elementAt 該方法只處理在指定位置的事件
ignoreElements 忽略所有元素,只發(fā)error或complete事件
take 執(zhí)行前幾個事件
takeLast 執(zhí)行后幾個事件
Skip 跳過前幾個事件
Sample 設(shè)置一個notifier。每當(dāng)收到notifier事件,就從源序列去一個最新的事件并發(fā)送。二如果兩次notifier事件之間沒有源序列的事件,則不發(fā)送。
debounce debounce(0.5, scheduler: MainScheduler.instance)//只發(fā)送間隔超過0.5的元素。
條件操作符
amb 當(dāng)傳入多個?Observables?到?amb?操作符時,它將取第一個發(fā)出元素或產(chǎn)生事件的?Observable,然后只發(fā)出它的元素。并忽略掉其他的?Observables
takeWhile 該方法依次判斷Observable序列的每一個值是否滿足給定的條件。當(dāng)?shù)谝粋€不滿足條件的值出現(xiàn),它便Complete。
takeUntil 該方法設(shè)定另一個Observable,當(dāng)這個Observable發(fā)出值或Complete,那么訂閱源自動就完成
skipWhile 當(dāng)滿足給定的條件,就跳過發(fā)出的event。直到條件不滿足的時候,開始執(zhí)行,之后不會跳過
skipUntil 一直跳過,直到notifier發(fā)出值或Complete
結(jié)合操作操作符
startWith 在Observable序列開始之前插入一些事件元素。
merge 將多個Observable 合并成一個Observable,和flatMap{$0}一樣
zip? 將多個Observable壓縮成。如:序列A,B,序列A的第一個值一定要與B的第一個值合并成新元素,一一相對應(yīng)。這些新元素組成一個新的序列
combineLatest 于zip的區(qū)別:如序列A,B,序列A產(chǎn)生一個新的值,只需和B的當(dāng)前最新的值合成就行,反之也行,不需要相對應(yīng)。這些新元素組成一個新的序列。
withLatestFrom? ? 序列A,B:A.withLatestFrom(B)....當(dāng)A發(fā)出一個元素,就從B取出一個最新的元素并發(fā)送。
switchLatest switchLatest?有點像其他語言的switch方法,可以對事件流進行轉(zhuǎn)換。
比如本來監(jiān)聽的?subject1,我可以通過更改variable??里面的value??更換事件源。變成監(jiān)聽subject2?
和flatMapLatest{$0}一樣
算數(shù)操作符
toArray? 改操作符先把一個序列轉(zhuǎn)成一個數(shù)組,并作為一個單一的事件發(fā)送,然后結(jié)束
reduce? 接受一個初始值,和一個操作符。將給定的初始值,與序列里的每個值進行累計運算。得到一個最終結(jié)果,并將其作為單個值發(fā)送出去。
concat 會把多個Observavle序列合并(串聯(lián))為一個Observable序列。并且只有當(dāng)前一個Observable序列發(fā)出一個completed事件,才會開始發(fā)送下一個Observable序列事件。與concatMap{$0}一樣
連接操作
publish 將普通的序列轉(zhuǎn)換成一個可連接的序列,同時該序列不會立刻發(fā)送事件,只有在調(diào)用connect之后才會開始
replay 與publish不同的:新的訂閱者還能收到訂閱之前的事件消息(數(shù)量由設(shè)置的bufferSize決定)
Multicaset 同樣是將一個正常的序列轉(zhuǎn)換成一個可連接的序列。同時muticase方法還可以傳入一個subject,每當(dāng)序列發(fā)送事件都會觸發(fā)這個Subject也發(fā)送
refCount 將一個可被連接的序列轉(zhuǎn)換成普通的序列。但是也還是會共享一個Observable源。
share(relay:)? 是repaly于refCount結(jié)合。先用repaly,變成一個帶緩存的可連接同步序列,再用refCount,變成一個普通帶緩存的同步序列。同步的意思就是 -> 使得觀察者共享源Observable
其他操作符
delay 使Observable延遲發(fā)送
delaySubscriptioin 是Observable延遲訂閱
materialize? 將一個Observable產(chǎn)生的event轉(zhuǎn)換成元素,然后發(fā)送出去
dematerialize 與 materialize相反
Timeout 如果源Observable 在規(guī)定時間內(nèi)沒有發(fā)任何元素,就產(chǎn)生一個超時的error時間
using? 使用?using?操作符創(chuàng)建?Observable?時,同時會創(chuàng)建一個可被清除的資源,一旦?Observable終止了,那么這個資源就會被清除掉了。
例子使用了do(onNext....)給序列添加訂閱者的操作返回的但是序列,如果對這個序列訂閱,只需Subscript()返回Disposable,就能執(zhí)行do里面設(shè)置的操作。
? Observable.using({() -> AnyDisposable in
? ? ?return AnyDisposable(infiniteInterval$.subscribe()) //資源必須要用個遵守Disposable的class包裹
? ? ? ? }) { (_) ->Observable<Int>?in
? ? ? ? ? ? return? limited$ //返回一個序列
? ? ? ? }.subscribe()
特征序列
Single 發(fā)送一個error,或者一個元素,應(yīng)用場景網(wǎng)絡(luò)請求
completable 發(fā)送一個error,或者是一個complete,應(yīng)用場景本地存儲
Maybe 發(fā)送一個error,或元素,或complete。