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

一、為什么要使用RxSwift?

本篇作為新手讀的懂的RxSwift源碼解析系列第零篇,不會(huì)過(guò)多地介紹RxSwift的優(yōu)點(diǎn)。因?yàn)榧热蛔x者已經(jīng)開(kāi)始閱讀RxSwift的源碼了,必然是已經(jīng)對(duì)RxSwift有了一定的了解了,所以這里只簡(jiǎn)單談一下筆者的感受。

筆者認(rèn)為,RxSwift作為一個(gè)響應(yīng)式編程框架,帶來(lái)的第一個(gè)好處在于邏輯的聚合。大家在平常APP開(kāi)發(fā)過(guò)程中,會(huì)處理大量的用戶交互事件,并且會(huì)涉及到大量的邏輯跳轉(zhuǎn),通過(guò)閉包、代理、通知、KVO等等方式來(lái)傳遞數(shù)據(jù)。這就會(huì)導(dǎo)致業(yè)務(wù)邏輯的分散,同一條業(yè)務(wù)鏈很可能分散在多個(gè)類(lèi)當(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)聽(tīng)的序列,并提供大量功能各異的操作符,通過(guò)聲明式的語(yǔ)句來(lái)完成數(shù)據(jù)的獲取,轉(zhuǎn)換,結(jié)合及綁定。

二、為什么要閱讀RxSwift源碼

在這里,筆者不想說(shuō)太多關(guān)于閱讀源碼的好處,因?yàn)槎际翘自?,只想放一張圖:


image.png

由于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類(lèi)型:

@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中三種不同類(lèi)型的事件:

.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"。另外常見(jiàn)的操作符還有filter, flatMap,compactMap, withLatestFrom , skip等等,我們會(huì)在后續(xù)的文章中陸續(xù)進(jìn)行分析。

四、RxSwift的核心邏輯

其實(shí),通過(guò)上面對(duì)RxSwift三大核心概念的介紹,我們已經(jīng)大致了解了RxSwift的核心邏輯:

rxswift_core_logic.png

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

五、結(jié)語(yǔ)

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

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

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