一、為什么要使用RxSwift?
本篇作為新手讀的懂的RxSwift源碼解析系列第零篇,不會過多地介紹RxSwift的優(yōu)點(diǎn)。因?yàn)榧热蛔x者已經(jīng)開始閱讀RxSwift的源碼了,必然是已經(jīng)對RxSwift有了一定的了解了,所以這里只簡單談一下筆者的感受。
筆者認(rèn)為,RxSwift作為一個(gè)響應(yīng)式編程框架,帶來的第一個(gè)好處在于邏輯的聚合。大家在平常APP開發(fā)過程中,會處理大量的用戶交互事件,并且會涉及到大量的邏輯跳轉(zhuǎn),通過閉包、代理、通知、KVO等等方式來傳遞數(shù)據(jù)。這就會導(dǎo)致業(yè)務(wù)邏輯的分散,同一條業(yè)務(wù)鏈很可能分散在多個(gè)類當(dāng)中,從而給調(diào)試和排錯(cuò)帶來難度,也就容易為Bug的出現(xiàn)埋下隱患。而通過RxSwift,則可以通過RxSwift提供的各種操作符實(shí)現(xiàn)邏輯的聚合。
RxSwift帶來的另一個(gè)好處在于響應(yīng)式的編程思想,將所有的事件都描述成一個(gè)可監(jiān)聽的序列,并提供大量功能各異的操作符,通過聲明式的語句來完成數(shù)據(jù)的獲取,轉(zhuǎn)換,結(jié)合及綁定。
二、為什么要閱讀RxSwift源碼
在這里,筆者不想說太多關(guān)于閱讀源碼的好處,因?yàn)槎际翘自?,只想放一張圖:

由于RxSwift是一個(gè)高度封裝的框架,代碼高度抽象,隨著不同操作符的作用,其調(diào)用鏈也會變得極度復(fù)雜,這就給我們debug帶來了巨大的挑戰(zhàn)。
沒錯(cuò),為了能夠?qū)xSwift進(jìn)行調(diào)試,這就是筆者閱讀RxSwift源碼最原始的動力。
三、RxSwift的核心概念
RxSwift的核心概念主要有三個(gè):Observable,Observer,Operator。
Observable
說Observable,需要先說兩個(gè)協(xié)議。ObservableConvertibleType和ObservableConvertibleType。
public protocol ObservableConvertibleType {
associatedtype Element
func asObservable() -> Observable<Element>
}
public protocol ObservableType: ObservableConvertibleType {
func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element
}
extension ObservableType {
public func asObservable() -> Observable<Element> {
Observable.create { o in self.subscribe(o) }
}
}
ObservableConvertibleType協(xié)議定義了一個(gè)方法,那就是asObservable(),返回一個(gè)Observable。
ObservableType則定義了一個(gè)subscribe<Observer: ObserverType>(_ observer: Observer),即訂閱一個(gè)Observer.
Observable就是遵循了ObservableType的class。
綜上,Observable就是一個(gè)可以通過調(diào)用subscribe方法被訂閱的可觀察序列。
Observer
Observer,就是一個(gè)觀察者,它也是通過一個(gè)協(xié)議(ObserverType)實(shí)現(xiàn)的:
public protocol ObserverType {
associatedtype Element
func on(_ event: Event<Element>)
}
ObserverType定義了一個(gè)on(_ event: Event<Element>)方法,參數(shù)是Event類型:
@frozen public enum Event<Element> {
/// Next element is produced.
case next(Element)
/// Sequence terminated with an error.
case error(Swift.Error)
/// Sequence completed successfully.
case completed
}
/// Sequence terminated with an error.
case error(Swift.Error)
/// Sequence completed successfully.
case completed
}</pre>
這是個(gè)枚舉,定義了RxSwift中三種不同類型的事件:
.next:一個(gè)正常的事件
.error:一個(gè)錯(cuò)誤事件
.completed:一個(gè)完成事件
所以,RxSwift最基礎(chǔ)最核心的邏輯就出來了:Observable通過subscribe訂閱Observer,并且在產(chǎn)生事件時(shí)通過Observer的on(_ event:)方法來傳遞事件。至于事件是如何產(chǎn)生的,我們將在下一篇文章中分析。
Operator
RxSwift中第三個(gè)概念叫做Operator(操作符)。
前兩個(gè)概念解決了事件的產(chǎn)生及傳遞,但是沒有解決一個(gè)問題:產(chǎn)生的事件可能并不是我們所需求的,而操作符正好就可以解決這一問題。
比如,我們有一個(gè)產(chǎn)生Int事件的序列,但是我們需要的可能是一個(gè)String事件的序列,并且我們希望這個(gè)String是Int進(jìn)行了一定的轉(zhuǎn)換后的結(jié)果,這時(shí)候我們就需要一個(gè)操作符:map
Observable<Int>.of(1,2,3,4).map { value in
return String(value*2)
}
.subscrib(onNext: { str in
print(str)
})
.disposed(by: disposeBag)
通過map操作符,我們將原始序列發(fā)送的Int序列1,2,3,4轉(zhuǎn)換成了String序列"2", "4", "6", "8"。另外常見的操作符還有filter, flatMap,compactMap, withLatestFrom , skip等等,我們會在后續(xù)的文章中陸續(xù)進(jìn)行分析。
四、RxSwift的核心邏輯
其實(shí),通過上面對RxSwift三大核心概念的介紹,我們已經(jīng)大致了解了RxSwift的核心邏輯:

Observable通過Operator轉(zhuǎn)換之后,訂閱Observer,實(shí)現(xiàn)事件的轉(zhuǎn)換與綁定。
五、結(jié)語
作為系列文章的第一篇,本文只是簡單介紹了RxSwift的核心概念和核心邏輯,至于其具體的實(shí)現(xiàn)邏輯,我們將在后續(xù)的文章中逐步分析,敬請期待。