RxSwift源碼分析--核心概念與核心邏輯

搬運(yùn)

一斯够、為什么要使用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:

image

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

image

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末周循,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子万俗,更是在濱河造成了極大的恐慌湾笛,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闰歪,死亡現(xiàn)場(chǎng)離奇詭異嚎研,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)库倘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門临扮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)论矾,“玉大人,你說(shuō)我怎么就攤上這事杆勇∧茨遥” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵靶橱,是天一觀的道長(zhǎng)翩蘸。 經(jīng)常有香客問(wèn)我七冲,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任坤塞,我火速辦了婚禮刀诬,結(jié)果婚禮上滋戳,老公的妹妹穿的比我還像新娘跪另。我一直安慰自己,他們只是感情好佳遣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布识埋。 她就那樣靜靜地躺著,像睡著了一般零渐。 火紅的嫁衣襯著肌膚如雪窒舟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天诵盼,我揣著相機(jī)與錄音惠豺,去河邊找鬼。 笑死风宁,一個(gè)胖子當(dāng)著我的面吹牛洁墙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播戒财,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼热监,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了饮寞?” 一聲冷哼從身側(cè)響起孝扛,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎骂际,沒(méi)想到半個(gè)月后疗琉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡歉铝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凑耻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片太示。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柠贤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出类缤,到底是詐尸還是另有隱情臼勉,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布餐弱,位于F島的核電站宴霸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏膏蚓。R本人自食惡果不足惜瓢谢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望驮瞧。 院中可真熱鬧氓扛,春花似錦、人聲如沸论笔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)狂魔。三九已至蒜埋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間最楷,已是汗流浹背理茎。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留管嬉,地道東北人皂林。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蚯撩,于是被迫代替她去往敵國(guó)和親础倍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容