RXSwift_操作符

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

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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末橄镜,一起剝皮案震驚了整個(gè)濱河市洽胶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖喷好,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梗搅,死亡現(xiàn)場(chǎng)離奇詭異效览,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門矛洞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沼本,“玉大人锭沟,你說我怎么就攤上這事”韬欤” “怎么了祝辣?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵蝙斜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我孕荠,道長(zhǎng),這世上最難降的妖魔是什么弯予? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任熙涤,我火速辦了婚禮,結(jié)果婚禮上祠挫,老公的妹妹穿的比我還像新娘。我一直安慰自己骚灸,他們只是感情好慌植,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布蝶柿。 她就那樣靜靜地躺著,像睡著了一般交汤。 火紅的嫁衣襯著肌膚如雪芙扎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天俏橘,我揣著相機(jī)與錄音圈浇,去河邊找鬼。 笑死磷蜀,一個(gè)胖子當(dāng)著我的面吹牛蠕搜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播妓灌,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼虫埂,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了缝呕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤摊聋,失蹤者是張志新(化名)和其女友劉穎栈暇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體煎源,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡香缺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年图张,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姑隅。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡倔撞,死狀恐怖慕趴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情躏啰,我是刑警寧澤耙册,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布详拙,位于F島的核電站,受9級(jí)特大地震影響饶辙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脯爪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尚揣。 院中可真熱鬧守屉,春花似錦、人聲如沸滨巴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜈垮。三九已至裕照,卻和暖如春晋南,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偶妖。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工政溃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扼鞋。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像撮慨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子变隔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

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

  • 本篇文章介主要紹RxJava中操作符是以函數(shù)作為基本單位,與響應(yīng)式編程作為結(jié)合使用的柑爸,對(duì)什么是操作盒音、操作符都有哪些...
    嘎啦果安卓獸閱讀 2,863評(píng)論 0 10
  • 前面的內(nèi)容中已經(jīng)學(xué)習(xí)了如何創(chuàng)建, 過濾, 變換 observable 的事件序列, 尤其是需要留意 flatMap...
    貘鳴閱讀 1,750評(píng)論 0 2
  • 本文章內(nèi)部分圖片資源來自RayWenderlich.com 本文結(jié)合自己的理解來總結(jié)介紹一下RxSwift最基本的...
    FKSky閱讀 2,884評(píng)論 4 14
  • 注:只包含標(biāo)準(zhǔn)包中的操作符,用于個(gè)人學(xué)習(xí)及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 2,195評(píng)論 2 8
  • 2018.2.27 星期二 晴 今天給倆每人買了一個(gè)大大卷泡泡糖又勾起了小時(shí)候的回憶颇玷。我們小時(shí)候買一盒5毛錢谒亦,...
    廈門路小學(xué)邵藝馨媽媽閱讀 93評(píng)論 0 3