RXSwift_操作符

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ā)errorcomplete事件

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? ? 序列AB: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()

Swift - RxSwift的使用詳解15(錯誤處理)

特征序列

Single 發(fā)送一個error,或者一個元素,應(yīng)用場景網(wǎng)絡(luò)請求

completable 發(fā)送一個error,或者是一個complete,應(yīng)用場景本地存儲

Maybe 發(fā)送一個error,或元素,或complete。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內(nèi)容