
就問此時此刻還有誰?45度仰望天空,該死!我這無處安放的魅力!
- RxSwift(1)—— 初探
- RxSwift(2)—— 核心邏輯源碼分析
- RxSwift(3)—— Observable序列的創(chuàng)建方式
- RxSwift(4)—— 高階函數(shù)(上)
- RxSwift(5)—— 高階函數(shù)(下)
- RxSwift(6)—— scheduler源碼解析(上)
- RxSwift(7)—— scheduler源碼解析(下)
- RxSwift(8)—— KVO底層探索(上)
- RxSwift(9)—— KVO底層探索(下)
- RxSwift(10)—— 場景序列總結(jié)
- RxSwift(11)—— 銷毀者-dispose源碼解析
- RxSwift(12)—— Subject即攻也守
- RxSwift(13)—— 爬過的坑
- RxSwift(14)—— MVVM雙向綁定
RxSwift目錄直通車--- 和諧學(xué)習(xí),不急不躁!
這個篇章初探
RxSwift--函數(shù)響應(yīng)式框架,迎合Swift語法特性,是非常爽的一件事!當(dāng)北京遇上西雅圖,當(dāng)Swift遇上RxSwift。我的天??!簡直爽的不要不要的
函數(shù)響應(yīng)式編程
一:函數(shù)式
函數(shù)式編程簡稱FP(Functional Programming),函數(shù)式編程就是一種抽象程度很高的編程范式,它將計算機(jī)運(yùn)算看做是數(shù)學(xué)中函數(shù)的計算,而純粹的函數(shù)式編程語言編寫的函數(shù)沒有變量,因此,任意一個函數(shù),只要輸入是確定的,輸出就是確定的,這種純函數(shù)我們稱之為沒有副作用。而允許使用變量的程序設(shè)計語言,由于函數(shù)內(nèi)部的變量狀態(tài)不確定,同樣的輸入,可能得到不同的輸出,因此,這種函數(shù)是有副作用的。
函數(shù)式編程的一個特點(diǎn)就是:允許把函數(shù)本身作為參數(shù)傳入另一個函數(shù),同時還允許返回一個函數(shù)!
函數(shù)表達(dá)式: y = f(x) ---> x = f(x) ---> y = f(f(x))
常規(guī)需求例子,感受函數(shù)式的舒服!
- 對于數(shù)組
[1,2,3,4,5,6,7,8,9,10],首先獲取> 2的數(shù)字, - 獲取到的數(shù)字之后 + 1,
- 再輸出所有數(shù)字中的偶數(shù)
let array = [1,2,3,4,5,6,7,8,9,10]
for num in array{
if num > 2{
let number = num + 1
if (number % 2 == 0) {
print(number)
}
}
}
- 上面的代碼嵌套層次之深,我覺得已經(jīng)非常惡心
- 代碼的可讀性也是非常差的
- 代碼復(fù)用性較低
- 維護(hù)以及代碼構(gòu)建成本太高,這樣就成了函數(shù)式出現(xiàn)的必要性
let array = [1,2,3,4,5,6,7,8,9,10]
array.filter{ $0 > 2}
.filter{ ($0+1) % 2 == 1}
.forEach { print($0) }
- 代碼層次非常清晰
- 代碼可讀性高
- 代碼復(fù)用性高
- 代碼簡潔,直接面向開發(fā)需求
二:響應(yīng)式
對象對某一數(shù)據(jù)流變化做出響應(yīng)的這種編碼方式稱為響應(yīng)式。
例如我們在愛奇藝平臺觀看視頻,我們只需要在某一個時刻訂閱了這個視頻,后面平臺自媒體運(yùn)營者不斷更新視頻,我們隨著時間也能自定接受推送,這就是響應(yīng)
在iOS開發(fā)中我們經(jīng)常會響應(yīng)一些事件button、tap、textField、textView、notifaction、KVO、NSTimer等等這些,都需要做響應(yīng)監(jiān)聽,響應(yīng)后都需要在對應(yīng)的響應(yīng)事件中去做處理,而原生開發(fā)中,觸發(fā)對象與響應(yīng)方法是分離的,如button的初始化和點(diǎn)擊響應(yīng)方法是分離的。功能代碼與邏輯代碼分析,導(dǎo)致很多比較惡心的感覺!
blingbling, blingbling, blingbling!RxSwift 閃亮登場
RxSwift簡介
RxSwift 是 ReactiveX 家族的重要一員, ReactiveX 是 Reactive Extensions 的縮寫,一般簡寫為 Rx。ReactiveX 官方給Rx的定義是:Rx是一個使用可觀察數(shù)據(jù)流進(jìn)行異步編程的編程接口。

ReactiveX不僅僅是一個編程接口,它是一種編程思想的突破,它影響了許多其它的程序庫和框架以及編程語言。它拓展了觀察者模式,使你能夠自由組合多個異步事件,而不需要去關(guān)心線程,同步,線程安全,并發(fā)數(shù)據(jù)以及I/O阻塞。
RxSwift 是 Rx 為 Swift 語言開發(fā)的一門函數(shù)響應(yīng)式編程語言, 它可以代替iOS系統(tǒng)的 Target Action / 代理 / 閉包 / 通知 / KVO,同時還提供網(wǎng)絡(luò)、數(shù)據(jù)綁定、UI事件處理、UI的展示和更新、多線程……
鑒于Swift日漸增長的影響力,ios開發(fā)者不可避免的要學(xué)習(xí)和使用Swift這門語言進(jìn)行編程開發(fā)。而RxSwift對使用Swift的幫助有如下幾點(diǎn):
Swift為值類型,在傳值與方法回調(diào)上有影響,RxSwift一定程度上彌補(bǔ)Swift的靈活性
-
RxSwift使得代碼復(fù)用性較強(qiáng),減少代碼量 -
RxSwift因?yàn)槁暶鞫际遣豢勺兏?,增加代碼可讀性 -
RxSwift使得更易于理解業(yè)務(wù)代碼,抽象異步編程,統(tǒng)一代碼風(fēng)格 -
RxSwift使得代碼更易于編寫集成單元測試,增加代碼穩(wěn)定性

一:button點(diǎn)擊事件
//MARK: - RxSwift應(yīng)用-button響應(yīng)
func setupButton() {
// 傳統(tǒng)UI事件
self.button.addTarget(self, action: #selector(didClickButton), for: .touchUpInside)
// 這樣的操作 - 不行啊!代碼邏輯與事件邏輯分層
self.button.rx.tap
.subscribe(onNext: { [weak self] in
print("點(diǎn)了,小雞燉蘑菇")
self?.view.backgroundColor = UIColor.orange
})
.disposed(by: disposeBag)
}
二:textfiled文本響應(yīng)
//MARK: - RxSwift應(yīng)用-textfiled
func setupTextFiled() {
// 我們?nèi)绻獙斎氲奈谋具M(jìn)行操作 - 比如輸入的的內(nèi)容 然后我們獲取里面的偶數(shù)
// self.textFiled.delegate = self
// 感覺是不是特別惡心
// 下面我們來看看Rx
self.textFiled.rx.text.orEmpty.changed.subscribe(onNext: { (text) in
print("監(jiān)聽到了 - \(text)")
}).disposed(by: disposeBag)
self.textFiled.rx.text.bind(to: self.button.rx.title()).disposed(by: disposeBag)
}
三:scrollView效果
//MARK: - RxSwift應(yīng)用-scrollView
func setupScrollerView() {
scrollView.rx.contentOffset.subscribe(onNext: { [weak self] (content) in
self?.view.backgroundColor = UIColor.init(red: content.y/255.0*0.8, green: content.y/255.0*0.3, blue: content.y/255.0*0.6, alpha: 1);
print(content.y)
}).disposed(by: disposeBag)
}
- 從上面三個UI效果來說,如果原生實(shí)現(xiàn)必將做很多惡心的處理:
addTarget或者實(shí)現(xiàn)響應(yīng)代理, 但是在RxSwift的世界里只需要一句代碼:爽!
四:KVO
//MARK: - RxSwift應(yīng)用-KVO
func setupKVO() {
// 系統(tǒng)KVO 還是比較麻煩的
// person.addObserver(self, forKeyPath: "name", options: .new, context: nil)
person.rx.observeWeakly(String.self, "name").subscribe(onNext: { (change) in
print(change ?? "helloword")
}).disposed(by: disposeBag)
}
- 原生KVO就需要三部曲,非常惡心,其實(shí)對于我們開發(fā)來說根本沒必要!
-
RxSwift還是溫柔的一句代碼搞定
五:通知
//MARK: - 通知
func setupNotification(){
NotificationCenter.default.rx
.notification(UIResponder.keyboardWillShowNotification)
.subscribe { (event) in
print(event)
}.disposed(by: disposeBag)
}
- 通知的實(shí)現(xiàn),也是比較友善的:編程習(xí)慣都有在
RxSwift風(fēng)格里面保留 - 這樣能夠最大的降低開發(fā)者的門檻,也是一個優(yōu)秀框架的必備條件
六:手勢
//MARK: - 手勢
func setupGestureRecognizer(){
let tap = UITapGestureRecognizer()
self.label.addGestureRecognizer(tap)
self.label.isUserInteractionEnabled = true
tap.rx.event.subscribe { (event) in
print("點(diǎn)了label")
}.disposed(by: disposeBag)
}
- 很多小伙伴可能會吐槽手勢怎么不那么爽!其實(shí)你誤解,
RxSwift是實(shí)現(xiàn)的響應(yīng)關(guān)系,本身手勢也是需要添加事件對象的! - 當(dāng)然這里我個人建議:可以更多拓展一層!降低代碼量
- 感覺
RxSwift會把開發(fā)者變傻,哈哈哈......
七:網(wǎng)絡(luò)請求
//MARK: - RxSwift應(yīng)用-網(wǎng)絡(luò)請求
func setupNextwork() {
let url = URL(string: "https://www.baidu.com")
URLSession.shared.rx.response(request: URLRequest(url: url!))
.subscribe(onNext: { (response, data) in
print("response ==== \(response)")
print("data ===== \(data)")
}, onError: { (error) in
print("error ===== \(error)")
}).disposed(by: disposeBag)
}
- 針對
URLSession也是封裝處理。提供了response,data,json不同的便于開發(fā)者選擇的合適函數(shù),說白就是方便 - 但是針對網(wǎng)絡(luò)這一層,我們一般開發(fā)肯定是要處理,不可能這么簡單(畢竟不符合開發(fā)需求)
- 其實(shí)
RxSwift在網(wǎng)絡(luò)這一層也是有很多響應(yīng)式處理:比如典型的RxMoya
八:timer定時器
//MARK: - RxSwift應(yīng)用-timer定時器
func setupTimer() {
timer = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
timer.subscribe(onNext: { (num) in
print("hello word \(num)")
}).disposed(by: disposeBag)
}
-
RxSwift實(shí)現(xiàn)的timer免去了我們計時器的一些不必要的麻煩 - runloop影響
- 銷毀問題
- 線程問題
RxSwift這個框架非常牛逼,把函數(shù)響應(yīng)式玩到了高潮!無論從代碼量,還是從代碼的可讀性,抑或代碼的復(fù)用性......都是大大優(yōu)化!讓開發(fā)者拋棄更多的膠水代碼,直面開發(fā)需求。如果你還在為你開發(fā)效率而煩惱,那么
RxSwift是你不二的選擇!如果還在糾結(jié)怎么學(xué)習(xí),那么我的這個RxSwift專題就是你不二的選擇!如果你想更加系統(tǒng)學(xué)習(xí)進(jìn)階iOS,那么Cooci更是你不二的選擇!就問此時此刻還有誰?45度仰望天空,該死!我這無處安放的魅力!