RxSwift源碼分析(1)——初探

  1. RxSwift是函數(shù)響應(yīng)式編程框架,屬于Rx系列的其中一個框架。
什么是函數(shù)響應(yīng)式編程? (最好分開理解)

一:函數(shù)式
函數(shù)式編程簡稱FP(Functional Programming),函數(shù)式編程就是一種抽象程度很高的編程范式,它將計算機運算看做是數(shù)學中函數(shù)的計算,而純粹的函數(shù)式編程語言編寫的函數(shù)沒有變量,因此,任意一個函數(shù),只要輸入是確定的,輸出就是確定的,這種純函數(shù)我們稱之為沒有副作用。
而允許使用變量的程序設(shè)計語言,由于函數(shù)內(nèi)部的變量狀態(tài)不確定,同樣的輸入,可能得到不同的輸出,因此,這種函數(shù)是有副作用的。
函數(shù)式編程的一個特點就是:允許把函數(shù)本身作為參數(shù)傳入另一個函數(shù),同時還允許返回一個函數(shù)!

二:響應(yīng)式
對象對某一數(shù)據(jù)流變化做出響應(yīng)的這種編碼方式稱為響應(yīng)式。例如我們在愛奇藝平臺觀看視頻,我們只需要在某一個時刻訂閱了這個視頻,后面平臺自媒體運營者不斷更新視頻,我們隨著時間也能自定接受推送,這就是響應(yīng)。

RxSwift優(yōu)勢

RxSwift 是 Rx 為 Swift 語言開發(fā)的一門函數(shù)響應(yīng)式編程語言, 它可以代替iOS系統(tǒng)的 Target Action / 代理 / 閉包 / 通知 / KVO,同時還提供網(wǎng)絡(luò)、數(shù)據(jù)綁定、UI事件處理、UI的展示和更新、多線程……

  • Swift為值類型,在傳值與方法回調(diào)上有影響,RxSwift一定程度上彌補Swift的靈活性
  • RxSwift使得代碼復(fù)用性較強,減少代碼量
  • RxSwift因為聲明都是不可變更,增加代碼可讀性
  • RxSwift使得更易于理解業(yè)務(wù)代碼,抽象異步編程,統(tǒng)一代碼風格
  • RxSwift使得代碼更易于編寫集成單元測試,增加代碼穩(wěn)定性

{\large\text{作者:Cooci_和諧學習_不急不躁鏈接:http://www.itdecent.cn/p/5533c99bfa8e來源:簡書著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。}}

  1. 有一句話叫萬物皆Rx,就是所有對象都能點出rx,例如object.rx。從源碼里可以看到,rx這個屬性是ReactiveCompatible協(xié)議的,而NSObject繼承了ReactiveCompatible,所以所有對象都能點出rx
/// A type that has reactive extensions.
public protocol ReactiveCompatible {
    /// Extended type
    associatedtype CompatibleType

    /// Reactive extensions.
    static var rx: Reactive<CompatibleType>.Type { get set }

    /// Reactive extensions.
    var rx: Reactive<CompatibleType> { get set }
}
extension ReactiveCompatible {
    ...
}

import class Foundation.NSObject

/// Extend NSObject with `rx` proxy.
extension NSObject: ReactiveCompatible { }
  1. RxSwift的響應(yīng)流程主要分為:

創(chuàng)建序列 -> 訂閱 -> 發(fā)送信號,響應(yīng) -> 銷毀

  1. 使用例子:
NotificationCenter.default.rx.notification(UIResponder.keyboardWillShowNotification)
.subscribe(onNext: { (notification) in
    print("鍵盤彈出")
 }).disposed(by: disposeBag)
button.rx.tap
.subscribe(onNext: { (event) in
    print("點擊按鈕")
}).disposed(by: disposeBag)
textFiled.rx.text.changed.subscribe { (text) in
    print("輸入改變")
}.disposed(by: disposeBag)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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