Subject創(chuàng)建訂閱Source
PublishSubject 最普通的subject,對(duì)它訂閱的訂閱者只會(huì)收到恭垦,后面發(fā)的值番挺。如果對(duì)一個(gè)Complete/error的subject訂閱,會(huì)馬上收到complete/error玄柏。
BehaviorSubject? 它的訂閱者在訂閱的時(shí)候會(huì)收到上一個(gè)event( error粪摘、complete、next)瑰妄。創(chuàng)建時(shí)候需要一個(gè)初始值映砖。
ReplaySubject? 創(chuàng)建的時(shí)候用creat(buffferSize:Int)設(shè)置緩存的大小, 緩存的只緩存next。它的訂閱者竹宋,在訂閱的時(shí)候會(huì)馬上收到緩存的next。如果訂閱源是Complete/error秒拔,那么還會(huì)收到Complete/error飒硅。
Variable 是對(duì)behaviorSubject的封裝。和behaviorSubject一樣庵芭,創(chuàng)建提供一個(gè)初始值雀监,它的訂閱者也會(huì)馬上收到上一個(gè)event。
1.不同的是它不需要手動(dòng)complete()好乐,當(dāng)Variable銷毀的時(shí)候系統(tǒng)會(huì)自動(dòng)調(diào)用complete瓦宜。2.放送event不用onNext(),而是通過對(duì)其屬性value賦值
變換操作符
buffer ?方法作用是緩沖組合,第一個(gè)參數(shù)是緩沖時(shí)間,第二個(gè)參數(shù)是緩沖個(gè)數(shù)废离,第三個(gè)參數(shù)是線程蜻韭。訂閱者收到的是一個(gè)數(shù)組闺魏。如果 緩存時(shí)間1S俯画,個(gè)數(shù) 3。那么每緩沖3個(gè)就發(fā)出泡仗,如果一秒內(nèi)不足3個(gè)也發(fā)送娩怎,一個(gè)都不用就發(fā)送[]截亦。
window ? window操作符和??buffer十分相似魁巩。不過?buffer?是周期性的將緩存的元素集合發(fā)送出來,而?window周期性將元素集合以O(shè)bservable?的形態(tài)發(fā)送出來谷遂。
map? 很熟
flatMap flatMap操作符會(huì)對(duì)Observable的每一個(gè)元素轉(zhuǎn)換成Observables肾扰,然后這些Observables的元素合并后再發(fā)送出來集晚。即又將其“flat”降維成一個(gè)Observable序列
flatMapLatest flatMapLatest與?flatMap的唯一區(qū)別是:flatMapLatest只會(huì)接收最新 value的事件偷拔。
concatMap concatMap與??flatMap的唯一區(qū)別是:當(dāng)前一個(gè)?observable?元素發(fā)送完畢后,后一個(gè)observable?才可以開始發(fā)出元素蛤签〕屏或者說等待前一個(gè)??observable產(chǎn)生完成事件后鲫尊,才對(duì)后一個(gè)?observable?進(jìn)行訂閱。
scan 就是先給一個(gè)初始值,然后不斷的拿前一個(gè)的結(jié)果和最新的值進(jìn)行處理操作匙奴。
groupBy 就是將源Observable分解為多個(gè)子Observable谍肤,然后將這些子Observable發(fā)送出來荒揣。
過濾操作符
filter 去除不滿足給定條件的事件
distinctUntilChanged 過濾連續(xù)重復(fù)的事件
single 限制只發(fā)送一次事件,或者滿足條件的第一個(gè)事件俩滥。如果存在有多個(gè)事件或者沒有事件都發(fā)發(fā)出一個(gè)error事件霜旧。如果只有一個(gè)事件,則不會(huì)發(fā)出error事件
elementAt 該方法只處理在指定位置的事件
ignoreElements 忽略所有元素崎逃,只發(fā)error或complete事件
take 執(zhí)行前幾個(gè)事件
takeLast 執(zhí)行后幾個(gè)事件
Skip 跳過前幾個(gè)事件
Sample 設(shè)置一個(gè)notifier今魔。每當(dāng)收到notifier事件错森,就從源序列去一個(gè)最新的事件并發(fā)送涩维。二如果兩次notifier事件之間沒有源序列的事件,則不發(fā)送。
debounce debounce(0.5, scheduler: MainScheduler.instance)//只發(fā)送間隔超過0.5的元素。
條件操作符
amb 當(dāng)傳入多個(gè)?Observables?到?amb?操作符時(shí)该面,它將取第一個(gè)發(fā)出元素或產(chǎn)生事件的?Observable题造,然后只發(fā)出它的元素界赔。并忽略掉其他的?Observables
takeWhile 該方法依次判斷Observable序列的每一個(gè)值是否滿足給定的條件。當(dāng)?shù)谝粋€(gè)不滿足條件的值出現(xiàn)敛惊,它便Complete瞧挤。
takeUntil 該方法設(shè)定另一個(gè)Observable,當(dāng)這個(gè)Observable發(fā)出值或Complete癌刽,那么訂閱源自動(dòng)就完成
skipWhile 當(dāng)滿足給定的條件,就跳過發(fā)出的event远荠。直到條件不滿足的時(shí)候档址,開始執(zhí)行守伸,之后不會(huì)跳過
skipUntil 一直跳過含友,直到notifier發(fā)出值或Complete
結(jié)合操作操作符
startWith 在Observable序列開始之前插入一些事件元素窘问。
merge 將多個(gè)Observable 合并成一個(gè)Observable,和flatMap{$0}一樣
zip? 將多個(gè)Observable壓縮成。如:序列A儿咱,B混埠,序列A的第一個(gè)值一定要與B的第一個(gè)值合并成新元素,一一相對(duì)應(yīng)吏颖。這些新元素組成一個(gè)新的序列
combineLatest 于zip的區(qū)別:如序列A,B缩多,序列A產(chǎn)生一個(gè)新的值,只需和B的當(dāng)前最新的值合成就行匙握,反之也行秦忿,不需要相對(duì)應(yīng)。這些新元素組成一個(gè)新的序列胎许。
withLatestFrom? ? 序列A辜窑,B:A.withLatestFrom(B)....當(dāng)A發(fā)出一個(gè)元素穆碎,就從B取出一個(gè)最新的元素并發(fā)送放钦。
switchLatest switchLatest?有點(diǎn)像其他語言的switch方法操禀,可以對(duì)事件流進(jìn)行轉(zhuǎn)換床蜘。
比如本來監(jiān)聽的?subject1扬蕊,我可以通過更改variable??里面的value??更換事件源尾抑。變成監(jiān)聽subject2?
和flatMapLatest{$0}一樣
算數(shù)操作符
toArray? 改操作符先把一個(gè)序列轉(zhuǎn)成一個(gè)數(shù)組再愈,并作為一個(gè)單一的事件發(fā)送,然后結(jié)束
reduce? 接受一個(gè)初始值抗悍,和一個(gè)操作符赏壹。將給定的初始值蝌借,與序列里的每個(gè)值進(jìn)行累計(jì)運(yùn)算。得到一個(gè)最終結(jié)果擎鸠,并將其作為單個(gè)值發(fā)送出去劣光。
concat 會(huì)把多個(gè)Observavle序列合并(串聯(lián))為一個(gè)Observable序列。并且只有當(dāng)前一個(gè)Observable序列發(fā)出一個(gè)completed事件雄可,才會(huì)開始發(fā)送下一個(gè)Observable序列事件。與concatMap{$0}一樣
連接操作
publish 將普通的序列轉(zhuǎn)換成一個(gè)可連接的序列虐急,同時(shí)該序列不會(huì)立刻發(fā)送事件,只有在調(diào)用connect之后才會(huì)開始
replay 與publish不同的:新的訂閱者還能收到訂閱之前的事件消息(數(shù)量由設(shè)置的bufferSize決定)
Multicaset 同樣是將一個(gè)正常的序列轉(zhuǎn)換成一個(gè)可連接的序列。同時(shí)muticase方法還可以傳入一個(gè)subject谈山,每當(dāng)序列發(fā)送事件都會(huì)觸發(fā)這個(gè)Subject也發(fā)送
refCount 將一個(gè)可被連接的序列轉(zhuǎn)換成普通的序列举哟。但是也還是會(huì)共享一個(gè)Observable源。
share(relay:)? 是repaly于refCount結(jié)合秽褒。先用repaly,變成一個(gè)帶緩存的可連接同步序列蚂踊,再用refCount犁钟,變成一個(gè)普通帶緩存的同步序列炬灭。同步的意思就是 -> 使得觀察者共享源Observable
其他操作符
delay 使Observable延遲發(fā)送
delaySubscriptioin 是Observable延遲訂閱
materialize? 將一個(gè)Observable產(chǎn)生的event轉(zhuǎn)換成元素重归,然后發(fā)送出去
dematerialize 與 materialize相反
Timeout 如果源Observable 在規(guī)定時(shí)間內(nèi)沒有發(fā)任何元素育苟,就產(chǎn)生一個(gè)超時(shí)的error時(shí)間
using? 使用?using?操作符創(chuàng)建?Observable?時(shí)宙搬,同時(shí)會(huì)創(chuàng)建一個(gè)可被清除的資源勇垛,一旦?Observable終止了,那么這個(gè)資源就會(huì)被清除掉了讼积。
例子使用了do(onNext....)給序列添加訂閱者的操作返回的但是序列舆绎,如果對(duì)這個(gè)序列訂閱吕朵,只需Subscript()返回Disposable努溃,就能執(zhí)行do里面設(shè)置的操作。
? Observable.using({() -> AnyDisposable in
? ? ?return AnyDisposable(infiniteInterval$.subscribe()) //資源必須要用個(gè)遵守Disposable的class包裹
? ? ? ? }) { (_) ->Observable<Int>?in
? ? ? ? ? ? return? limited$ //返回一個(gè)序列
? ? ? ? }.subscribe()
Swift - RxSwift的使用詳解15(錯(cuò)誤處理)
特征序列
Single 發(fā)送一個(gè)error,或者一個(gè)元素斥铺,應(yīng)用場(chǎng)景網(wǎng)絡(luò)請(qǐng)求
completable 發(fā)送一個(gè)error晾蜘,或者是一個(gè)complete,應(yīng)用場(chǎng)景本地存儲(chǔ)
Maybe 發(fā)送一個(gè)error岖常,或元素葫督,或complete。