1.RxSwift初識(shí)
RxSwift是 ReactiveX 的swift版本斗搞,是一種函數(shù)式響應(yīng)編程的框架逐虚。RxSwift遵循Functional Reactive Programming(FRP)的設(shè)計(jì)規(guī)范垄琐,其目的是通過(guò)類似于信號(hào)流或者觀察者的方式來(lái)實(shí)現(xiàn)代碼的邏輯運(yùn)算勾给,使代碼更加的簡(jiǎn)潔、明了蔗坯。
2.RxSwift觀察者模式
什么是觀察者模式砰奕?相信學(xué)習(xí)ios的都知道蛛芥,在ios眾多的設(shè)計(jì)模式中有一種叫觀察者的設(shè)計(jì)模式(即KVO),其目的在于通過(guò)發(fā)送通知的方式來(lái)進(jìn)行相應(yīng)的操作军援。舉個(gè)例子:你在燒了一壺水仅淑,燒好了會(huì)聽到按鈕彈開的聲音,這時(shí)你會(huì)去把水灌到熱水瓶里胸哥。水壺就是被觀察者涯竟,你是觀察者,當(dāng)水燒好了會(huì)給你發(fā)送按鈕彈開的事件空厌,這時(shí)你接收到通知庐船,去執(zhí)行把水灌到熱水瓶里的操作。這就是RxSwift要告訴我們的觀察者模式嘲更。
3.RxSwift基礎(chǔ)知識(shí)
根據(jù)GitHub上下載的Rx.playground進(jìn)行基礎(chǔ)知識(shí)的學(xué)習(xí)筐钟,由于是英文的版本,我對(duì)基礎(chǔ)知識(shí)進(jìn)行了簡(jiǎn)要的翻譯赋朦。項(xiàng)目地址:RxStudy
Observable和Observer
顧名思義篓冲,就是被觀察者和觀察者。Observable是被觀察者宠哄,Observer是觀察者壹将。Observer(觀察者)訂閱(subscribe)Observable(被觀察者),觀察者就會(huì)受到被觀察者發(fā)出的通知事件毛嫉。
subscribe
subscribe就是觀察者訂閱被觀察者的事件诽俯,比如next,error承粤,completed事件惊畏。
DisposeBag
類似ios中的ARC,用于釋放RxSwift中資源密任,防止內(nèi)存泄露。
never
創(chuàng)建一個(gè)永不終止并且永不發(fā)送任何事件的序列
empty
創(chuàng)建一個(gè)只發(fā)送.Completed事件的空序列
just
創(chuàng)建一個(gè)只包含一個(gè)元素的序列
of
創(chuàng)建一個(gè)包含固定數(shù)量的元素的序列
from
創(chuàng)建一個(gè)SequenceType類型元素的序列(例如:Array, Dictionary, Set)
create
創(chuàng)建一個(gè)自定義的序列
range
創(chuàng)建一個(gè)可觀察的序列偷俭,該序列釋放一系列連續(xù)的整數(shù)浪讳,然后終止
repeatElement
創(chuàng)建一個(gè)可觀察的序列,無(wú)限地釋放給定的元素
generate
創(chuàng)建一個(gè)可觀察的序列涌萤,只要提供的條件計(jì)算為true淹遵,則發(fā)出相應(yīng)的事件口猜。
deferred
為每個(gè)訂閱者創(chuàng)建一個(gè)新的可觀察序列。
error
創(chuàng)建一個(gè)可觀察的序列透揣,該序列不發(fā)出任何正常的事件济炎,只發(fā)出error事件并結(jié)束。
doOn
為每個(gè)已發(fā)出的事件前調(diào)用一個(gè)副作用動(dòng)作辐真,并發(fā)出(通過(guò))原始事件须尚。
PublishSubject
在訂閱時(shí)間內(nèi)向所有觀察者發(fā)送新事件。
ReplaySubject
發(fā)送新的事件給所有的觀察者侍咱,并指定先前事件緩存區(qū)的大小給新的觀察者耐床。
BehaviorSubject
發(fā)送新的事件給所有的觀察者,并向新的觀察者發(fā)送最近的一個(gè)事件楔脯,沒(méi)有則發(fā)送默認(rèn)值撩轰。
Variable
BehaviorSubject的進(jìn)一步封裝,所以會(huì)發(fā)送最近的事件給新的訂閱者昧廷。但不會(huì)收到 .Completed 和 .Error 這類的終結(jié)事件堪嫂,它會(huì)主動(dòng)在析構(gòu)的時(shí)候發(fā)送 .Complete。
startWith
在從被觀察者發(fā)送事件開始之前木柬,先發(fā)送指定的元素序列皆串。
merge
將兩個(gè)可觀察序列按照順序組合在一起,形成一個(gè)新的可觀察序列。
zip
將兩個(gè)可觀察序列按照順序組合在一起,形成一個(gè)新的可觀察序列,并一一對(duì)應(yīng)弄诲。
combineLatest
如果存在最多不超過(guò)8條的事件序列愚战,需要同時(shí)監(jiān)聽,那么每當(dāng)有新的事件發(fā)生的時(shí)候齐遵,combineLatest 會(huì)將每個(gè)序列的最新的一個(gè)元素進(jìn)行合并寂玲。
switchLatest
將可觀察序列發(fā)出的事件轉(zhuǎn)換成可觀察的序列,并從最近的可觀察序列中發(fā)送事件梗摇。
map
對(duì)每個(gè)元素都用函數(shù)做一次轉(zhuǎn)換拓哟,挨個(gè)映射一遍。
flatMap and flatMapLatest
將可觀察序列發(fā)射的元素轉(zhuǎn)化為可觀測(cè)序列伶授,并將兩個(gè)觀察到的序列合并為一個(gè)可觀察序列断序。這是有用的,例如糜烹,當(dāng)你有一個(gè)可觀察的序列违诗,它本身發(fā)射的是可觀察的序列,并且你希望能夠從一個(gè)可觀察的序列的新的事件作出反應(yīng)疮蹦。flatmap和flatmaplatest之間的區(qū)別是诸迟,flatmaplatest只會(huì)從最近的可觀察序列內(nèi)發(fā)射元素。
scan
有點(diǎn)像 reduce ,它會(huì)把每次的運(yùn)算結(jié)果累積起來(lái)阵苇,作為下一次運(yùn)算的輸入值壁公。
filter
只會(huì)讓符合條件的元素通過(guò)。
distinctUntilChanged
抑制可觀察序列發(fā)出的連續(xù)重復(fù)元素绅项。
elementAt
只處理在指定位置的事件紊册。
single
僅由可觀察序列發(fā)出的第一個(gè)元素(或滿足條件的第一個(gè)元素)。如果觀察到的序列發(fā)射是不符合條件的一個(gè)元素,則會(huì)拋出一個(gè)錯(cuò)誤。
take
從可觀察序列的開始僅釋放指定數(shù)量的元素忿峻。
takeLast
僅從可觀察序列的結(jié)束處釋放指定數(shù)量的元素。
takeWhile
只要指定的條件計(jì)算為true关斜,從可觀察序列的開始發(fā)出元素。
takeUntil
接收事件消息铺浇,直到另一個(gè)可觀察序列發(fā)出事件消息的時(shí)候痢畜。
skip
禁止從可觀察序列的開始發(fā)射指定數(shù)量的元素。
skipWhile
抑制從符合指定條件的可觀察序列的開始發(fā)射元素鳍侣。
skipWhileWithIndex
抑制從符合指定條件的可觀察序列的開始發(fā)射元素丁稀,并釋放剩余元素。閉包也傳遞了每個(gè)元素的索引倚聚。
skipUntil
直到某個(gè)可觀察序列發(fā)出了事件消息线衫,才開始接收當(dāng)前序列發(fā)出的事件消息。
toArray
將可觀察的序列轉(zhuǎn)換為數(shù)組惑折,將該數(shù)組作為新的元素通過(guò)可觀察序列發(fā)出授账,然后終止。
reduce
從初始值開始惨驶,然后將累加器閉包應(yīng)用于可觀察序列發(fā)出的所有元素白热,并將聚合結(jié)果返回為單個(gè)元素可觀察序列。
concat
concat會(huì)把多個(gè)序列和并為一個(gè)序列粗卜,并且當(dāng)前面一個(gè)序列發(fā)出了completed事件屋确,才會(huì)開始下一個(gè)序列的事件。
publish
將一個(gè)正常的序列轉(zhuǎn)換成一個(gè)連接性的序列续扔。
replay
將一個(gè)正常的序列轉(zhuǎn)換成一個(gè)連接性的序列攻臀,然后和replaySubject相似,能接收到訂閱之前的事件消息纱昧。
multicast
將一個(gè)正常的序列轉(zhuǎn)換成一個(gè)連接性的序列刨啸,并且通過(guò)特性的subject發(fā)送出去,比如PublishSubject识脆,或者replaySubject设联,behaviorSubject等加匈。不同的Subject會(huì)有不同的結(jié)果。
catchErrorJustReturn
通過(guò)返回一個(gè)可觀察到的序列仑荐,然后返回一個(gè)元素,然后終止纵东。
catchError
可以捕獲異常事件粘招,并且在后面無(wú)縫接上另一段事件序列,絲毫沒(méi)有異常的痕跡偎球。
retry
顧名思義洒扎,就是在出現(xiàn)異常的時(shí)候會(huì)再去從頭訂閱事件序列,妄圖通過(guò)『從頭再來(lái)』解決異常衰絮,無(wú)限制袍冷。
retry maxAttemptCount
顧名思義,就是在出現(xiàn)異常的時(shí)候會(huì)再去從頭訂閱事件序列猫牡,妄圖通過(guò)『從頭再來(lái)』解決異常胡诗,設(shè)置最大值來(lái)限制重新訂閱事件的次數(shù)。
debug
打印出所有訂閱淌友,事件和disposals煌恢。
RxSwift.Resources.total
查看RxSwift所有資源的占用,這對(duì)于在開發(fā)過(guò)程中的泄漏檢測(cè)是有用的震庭。
4.總結(jié)
以上是對(duì)RxSwift基礎(chǔ)知識(shí)的學(xué)習(xí)和理解瑰抵,雖然未應(yīng)用到實(shí)際的項(xiàng)目中,但也是略有感悟器联。RxSwift是適合使用swift開發(fā)者使用的一套框架二汛,如果你使用oc語(yǔ)言,可以參考ReactiveCocoa拨拓,ReactiveCocoa是以信號(hào)流的方式向我們闡述函數(shù)式響應(yīng)框架的思維模式肴颊,當(dāng)然ReactiveCocoa也有swift版本的,即ReactiveSwift千元。但我認(rèn)為RxSwift更為適合苫昌,因?yàn)镽eactiveX還包含了像RxJava,Rxjs等其他語(yǔ)言的版本,熟練掌握了其中的一種幸海,在去學(xué)習(xí)其他的你會(huì)覺(jué)得似成相識(shí)的感覺(jué)祟身。如果你致力于成為全棧型工程師,RxSwift將非常的適合你物独。