1.RxSwift初識
RxSwift是 ReactiveX 的swift版本,是一種函數式響應編程的框架。RxSwift遵循Functional Reactive Programming(FRP)的設計規范,其目的是通過類似于信號流或者觀察者的方式來實現代碼的邏輯運算,使代碼更加的簡潔、明了。
2.RxSwift觀察者模式
什么是觀察者模式?相信學習ios的都知道,在ios眾多的設計模式中有一種叫觀察者的設計模式(即KVO),其目的在于通過發送通知的方式來進行相應的操作。舉個例子:你在燒了一壺水,燒好了會聽到按鈕彈開的聲音,這時你會去把水灌到熱水瓶里。水壺就是被觀察者,你是觀察者,當水燒好了會給你發送按鈕彈開的事件,這時你接收到通知,去執行把水灌到熱水瓶里的操作。這就是RxSwift要告訴我們的觀察者模式。
3.RxSwift基礎知識
根據GitHub上下載的Rx.playground進行基礎知識的學習,由于是英文的版本,我對基礎知識進行了簡要的翻譯。項目地址:RxStudy
Observable和Observer
顧名思義,就是被觀察者和觀察者。Observable是被觀察者,Observer是觀察者。Observer(觀察者)訂閱(subscribe)Observable(被觀察者),觀察者就會受到被觀察者發出的通知事件。
subscribe
subscribe就是觀察者訂閱被觀察者的事件,比如next,error,completed事件。
DisposeBag
類似ios中的ARC,用于釋放RxSwift中資源,防止內存泄露。
never
創建一個永不終止并且永不發送任何事件的序列
empty
創建一個只發送.Completed事件的空序列
just
創建一個只包含一個元素的序列
of
創建一個包含固定數量的元素的序列
from
創建一個SequenceType類型元素的序列(例如:Array, Dictionary, Set)
create
創建一個自定義的序列
range
創建一個可觀察的序列,該序列釋放一系列連續的整數,然后終止
repeatElement
創建一個可觀察的序列,無限地釋放給定的元素
generate
創建一個可觀察的序列,只要提供的條件計算為true,則發出相應的事件。
deferred
為每個訂閱者創建一個新的可觀察序列。
error
創建一個可觀察的序列,該序列不發出任何正常的事件,只發出error事件并結束。
doOn
為每個已發出的事件前調用一個副作用動作,并發出(通過)原始事件。
PublishSubject
在訂閱時間內向所有觀察者發送新事件。
ReplaySubject
發送新的事件給所有的觀察者,并指定先前事件緩存區的大小給新的觀察者。
BehaviorSubject
發送新的事件給所有的觀察者,并向新的觀察者發送最近的一個事件,沒有則發送默認值。
Variable
BehaviorSubject的進一步封裝,所以會發送最近的事件給新的訂閱者。但不會收到 .Completed 和 .Error 這類的終結事件,它會主動在析構的時候發送 .Complete。
startWith
在從被觀察者發送事件開始之前,先發送指定的元素序列。
merge
將兩個可觀察序列按照順序組合在一起,形成一個新的可觀察序列。
zip
將兩個可觀察序列按照順序組合在一起,形成一個新的可觀察序列,并一一對應。
combineLatest
如果存在最多不超過8條的事件序列,需要同時監聽,那么每當有新的事件發生的時候,combineLatest 會將每個序列的最新的一個元素進行合并。
switchLatest
將可觀察序列發出的事件轉換成可觀察的序列,并從最近的可觀察序列中發送事件。
map
對每個元素都用函數做一次轉換,挨個映射一遍。
flatMap and flatMapLatest
將可觀察序列發射的元素轉化為可觀測序列,并將兩個觀察到的序列合并為一個可觀察序列。這是有用的,例如,當你有一個可觀察的序列,它本身發射的是可觀察的序列,并且你希望能夠從一個可觀察的序列的新的事件作出反應。flatmap和flatmaplatest之間的區別是,flatmaplatest只會從最近的可觀察序列內發射元素。
scan
有點像 reduce ,它會把每次的運算結果累積起來,作為下一次運算的輸入值。
filter
只會讓符合條件的元素通過。
distinctUntilChanged
抑制可觀察序列發出的連續重復元素。
elementAt
只處理在指定位置的事件。
single
僅由可觀察序列發出的第一個元素(或滿足條件的第一個元素)。如果觀察到的序列發射是不符合條件的一個元素,則會拋出一個錯誤。
take
從可觀察序列的開始僅釋放指定數量的元素。
takeLast
僅從可觀察序列的結束處釋放指定數量的元素。
takeWhile
只要指定的條件計算為true,從可觀察序列的開始發出元素。
takeUntil
接收事件消息,直到另一個可觀察序列發出事件消息的時候。
skip
禁止從可觀察序列的開始發射指定數量的元素。
skipWhile
抑制從符合指定條件的可觀察序列的開始發射元素。
skipWhileWithIndex
抑制從符合指定條件的可觀察序列的開始發射元素,并釋放剩余元素。閉包也傳遞了每個元素的索引。
skipUntil
直到某個可觀察序列發出了事件消息,才開始接收當前序列發出的事件消息。
toArray
將可觀察的序列轉換為數組,將該數組作為新的元素通過可觀察序列發出,然后終止。
reduce
從初始值開始,然后將累加器閉包應用于可觀察序列發出的所有元素,并將聚合結果返回為單個元素可觀察序列。
concat
concat會把多個序列和并為一個序列,并且當前面一個序列發出了completed事件,才會開始下一個序列的事件。
publish
將一個正常的序列轉換成一個連接性的序列。
replay
將一個正常的序列轉換成一個連接性的序列,然后和replaySubject相似,能接收到訂閱之前的事件消息。
multicast
將一個正常的序列轉換成一個連接性的序列,并且通過特性的subject發送出去,比如PublishSubject,或者replaySubject,behaviorSubject等。不同的Subject會有不同的結果。
catchErrorJustReturn
通過返回一個可觀察到的序列,然后返回一個元素,然后終止。
catchError
可以捕獲異常事件,并且在后面無縫接上另一段事件序列,絲毫沒有異常的痕跡。
retry
顧名思義,就是在出現異常的時候會再去從頭訂閱事件序列,妄圖通過『從頭再來』解決異常,無限制。
retry maxAttemptCount
顧名思義,就是在出現異常的時候會再去從頭訂閱事件序列,妄圖通過『從頭再來』解決異常,設置最大值來限制重新訂閱事件的次數。
debug
打印出所有訂閱,事件和disposals。
RxSwift.Resources.total
查看RxSwift所有資源的占用,這對于在開發過程中的泄漏檢測是有用的。
4.總結
以上是對RxSwift基礎知識的學習和理解,雖然未應用到實際的項目中,但也是略有感悟。RxSwift是適合使用swift開發者使用的一套框架,如果你使用oc語言,可以參考ReactiveCocoa,ReactiveCocoa是以信號流的方式向我們闡述函數式響應框架的思維模式,當然ReactiveCocoa也有swift版本的,即ReactiveSwift。但我認為RxSwift更為適合,因為ReactiveX還包含了像RxJava,Rxjs等其他語言的版本,熟練掌握了其中的一種,在去學習其他的你會覺得似成相識的感覺。如果你致力于成為全棧型工程師,RxSwift將非常的適合你。