一斯够、為什么要使用RxSwift?
本篇作為新手讀的懂的RxSwift源碼解析系列第零篇滨巴,不會(huì)過(guò)多地介紹RxSwift的優(yōu)點(diǎn)择懂。因?yàn)榧热蛔x者已經(jīng)開始閱讀RxSwift的源碼了炕舵,必然是已經(jīng)對(duì)RxSwift有了一定的了解了幽污,所以這里只簡(jiǎn)單談一下筆者的感受躺彬。
筆者認(rèn)為,RxSwift作為一個(gè)響應(yīng)式編程框架麻惶,帶來(lái)的第一個(gè)好處在于邏輯的聚合馍刮。大家在平常APP開發(fā)過(guò)程中,會(huì)處理大量的用戶交互事件用踩,并且會(huì)涉及到大量的邏輯跳轉(zhuǎn)渠退,通過(guò)閉包忙迁、代理、通知碎乃、KVO等等方式來(lái)傳遞數(shù)據(jù)姊扔。這就會(huì)導(dǎo)致業(yè)務(wù)邏輯的分散,同一條業(yè)務(wù)鏈很可能分散在多個(gè)類當(dāng)中梅誓,從而給調(diào)試和排錯(cuò)帶來(lái)難度恰梢,也就容易為Bug的出現(xiàn)埋下隱患。而通過(guò)RxSwift梗掰,則可以通過(guò)RxSwift提供的各種操作符實(shí)現(xiàn)邏輯的聚合嵌言。
RxSwift帶來(lái)的另一個(gè)好處在于響應(yīng)式的編程思想,將所有的事件都描述成一個(gè)可監(jiān)聽的序列及穗,并提供大量功能各異的操作符摧茴,通過(guò)聲明式的語(yǔ)句來(lái)完成數(shù)據(jù)的獲取,轉(zhuǎn)換埂陆,結(jié)合及綁定苛白。
二、為什么要閱讀RxSwift源碼
在這里焚虱,筆者不想說(shuō)太多關(guān)于閱讀源碼的好處购裙,因?yàn)槎际翘自挘幌敕乓粡垐D:
由于RxSwift是一個(gè)高度封裝的框架鹃栽,代碼高度抽象躏率,隨著不同操作符的作用,其調(diào)用鏈也會(huì)變得極度復(fù)雜民鼓,這就給我們debug帶來(lái)了巨大的挑戰(zhàn)薇芝。
沒(méi)錯(cuò),為了能夠?qū)xSwift進(jìn)行調(diào)試摹察,這就是筆者閱讀RxSwift源碼最原始的動(dòng)力恩掷。
三倡鲸、RxSwift的核心概念
RxSwift的核心概念主要有三個(gè):Observable供嚎,Observer,Operator峭状。
Observable
說(shuō)Observable克滴,需要先說(shuō)兩個(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è)可以通過(guò)調(diào)用subscribe方法被訂閱的可觀察序列仍翰。
Observer
Observer赫粥,就是一個(gè)觀察者,它也是通過(guò)一個(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ǔ)最核心的邏輯就出來(lái)了:Observable通過(guò)subscribe訂閱Observer灵迫,并且在產(chǎn)生事件時(shí)通過(guò)Observer的on(_ event:)方法來(lái)傳遞事件秦叛。至于事件是如何產(chǎn)生的,我們將在下一篇文章中分析瀑粥。
Operator
RxSwift中第三個(gè)概念叫做Operator(操作符)挣跋。
前兩個(gè)概念解決了事件的產(chǎn)生及傳遞,但是沒(méi)有解決一個(gè)問(wèn)題:產(chǎn)生的事件可能并不是我們所需求的狞换,而操作符正好就可以解決這一問(wè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)
通過(guò)map操作符割按,我們將原始序列發(fā)送的Int序列1,2,3,4轉(zhuǎn)換成了String序列"2", "4", "6", "8"膨报。另外常見的操作符還有filter, flatMap,compactMap, withLatestFrom , skip等等适荣,我們會(huì)在后續(xù)的文章中陸續(xù)進(jìn)行分析现柠。
四、RxSwift的核心邏輯
其實(shí)弛矛,通過(guò)上面對(duì)RxSwift三大核心概念的介紹够吩,我們已經(jīng)大致了解了RxSwift的核心邏輯:
Observable通過(guò)Operator轉(zhuǎn)換之后,訂閱Observer丈氓,實(shí)現(xiàn)事件的轉(zhuǎn)換與綁定