新手讀的懂的RxSwift源碼解析(零)-- 核心概念與核心邏輯

一、為什么要使用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)槎际翘自?,只想放一張圖:


image.png

由于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的核心邏輯:

rxswift_core_logic.png

Observable通過Operator轉(zhuǎn)換之后,訂閱Observer,實(shí)現(xiàn)事件的轉(zhuǎn)換與綁定。

五、結(jié)語

作為系列文章的第一篇,本文只是簡單介紹了RxSwift的核心概念和核心邏輯,至于其具體的實(shí)現(xiàn)邏輯,我們將在后續(xù)的文章中逐步分析,敬請期待。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容