廢話不多說(shuō),直接上干貨!?。?/p>
函數(shù)響應(yīng)式編程
函數(shù)式
函數(shù)式編程簡(jiǎn)稱(chēng)FP(Functional Programming),函數(shù)式編程是一種抽象程度很高的編程范式,將計(jì)算機(jī)運(yùn)算看做數(shù)學(xué)中的函數(shù)計(jì)算,實(shí)際上純粹的函數(shù)式語(yǔ)言編程編寫(xiě)的函數(shù)式?jīng)]有變量,任何一個(gè)函數(shù)只要輸入確定,則輸出就確定,這樣的模式我們稱(chēng)之為沒(méi)有副作用。允許使用變量的程序設(shè)計(jì)語(yǔ)言,由于內(nèi)部變量狀態(tài)不確定,同樣的輸入,可能得到不同的輸出結(jié)果,稱(chēng)之為函數(shù)副作用。
函數(shù)式編程特點(diǎn)是允許吧函數(shù)本身作為一個(gè)參數(shù)傳遞給另一個(gè)函數(shù),同時(shí)韓允許返回另一個(gè)函數(shù)。例如:
函數(shù)表達(dá)式: y = f(x) ---> x = f(x) ---> y = f(f(x))
舉個(gè)栗子??
對(duì)于數(shù)組[1,2,3,4,5,6,7,8,9]首先獲取》2的數(shù)字,在獲取數(shù)字之后+1,在輸出偶數(shù):
let array = [1,2,3,4,5,6,7,8,9]
for num in array{
if num > 2{
let number = num + 1
if (number % 2 == 0) {
print(number)
}
}
}
以上是常規(guī)寫(xiě)法.如果這樣實(shí)現(xiàn)呢:
let array = [1,2,3,4,5,6,7,8,9]
array.filter{$0 > 2}
.filter{($0 + 1) % 2 == 1}
.forEach{print($0)}
響應(yīng)式
對(duì)象某一數(shù)據(jù)流發(fā)生變化作出的相應(yīng)這種編碼方式稱(chēng)之為響應(yīng)式。
iOS開(kāi)發(fā)中經(jīng)常用需要相應(yīng)一些事件,button,tap,textfield,textView,KVO等等。接下來(lái)就介紹大殺器-------RXSwift。
RXSwift
RxSwift 是 ReactiveX 家族的重要一員, ReactiveX 是 Reactive Extensions 的縮寫(xiě),一般簡(jiǎn)寫(xiě)為 Rx。ReactiveX 官方給Rx的定義是:Rx是一個(gè)使用可觀察數(shù)據(jù)流進(jìn)行異步編程的編程接口。

ReactiveX 不僅僅是一個(gè)編程接口,它是一種編程思想的突破,它影響了許多其它的程序庫(kù)和框架以及編程語(yǔ)言。它拓展了觀察者模式,使你能夠自由組合多個(gè)異步事件,而不需要去關(guān)心線程,同步,線程安全,并發(fā)數(shù)據(jù)以及I/O阻塞。
RxSwift 是 Rx 為 Swift 語(yǔ)言開(kāi)發(fā)的一門(mén)函數(shù)響應(yīng)式編程語(yǔ)言, 它可以代替iOS系統(tǒng)的 Target Action / 代理 / 閉包 / 通知 / KVO,同時(shí)還提供網(wǎng)絡(luò)、數(shù)據(jù)綁定、UI事件處理、UI的展示和更新、多線程……
鑒于Swift日漸增長(zhǎng)的影響力,ios開(kāi)發(fā)者不可避免的要學(xué)習(xí)和使用Swift這門(mén)語(yǔ)言進(jìn)行編程開(kāi)發(fā)。而RxSwift對(duì)使用Swift的幫助有如下幾點(diǎn):
Swift為值類(lèi)型,在傳值與方法回調(diào)上有影響,RxSwift一定程度上彌補(bǔ)Swift的靈活性
- RxSwift使得代碼復(fù)用性較強(qiáng),減少代碼量
- RxSwift因?yàn)槁暶鞫际遣豢勺兏?,增加代碼可讀性
- RxSwift使得更易于理解業(yè)務(wù)代碼,抽象異步編程,統(tǒng)一代碼風(fēng)格
- RxSwift使得代碼更易于編寫(xiě)集成單元測(cè)試,增加代碼穩(wěn)定性
舉幾個(gè)常用的栗子:
1. button 點(diǎn)擊響應(yīng)
self.button.rx.tap
.subscribe(onNext:{
print("button tap action")
}).disposed(by: disposeBag)
2. textField 響應(yīng)
self.textField.rx.text.orEmpty
.skip(1)
.distinctUntilChanged()
.subscribe(onNext:{text in
print(text)
})
.disposed(by: disposeBag)
3. scrollView響應(yīng)
self.scrollView.rx.contentOffset.subscribe(onNext:{[weak self] (content) in
guard let strongSelf = self else {return}
strongSelf.view.backgroundColor = UIColor.init(red: content.y/255.0*0.6, green: content.y/255.0*0.3, blue: content.y/255.0*0.6, alpha: 1)
}).disposed(by: disposeBag)
4. KVO
person.rx.observeWeakly(String.self, "name").subscribe(onNext: { (change) in
print(change ?? "helloword")
}).disposed(by: disposeBag)
5. 通知
NotificationCenter.default.rx
.notification(UIResponder.keyboardWillShowNotification)
.subscribe { (event) in
print(event)
}.disposed(by: disposeBag)
6.手勢(shì)
let tap = UITapGestureRecognizer()
self.label.addGestureRecognizer(tap)
self.label.isUserInteractionEnabled = true
tap.rx.event.subscribe { (event) in
print("點(diǎn)了label")
}.disposed(by: disposeBag)
7.定時(shí)器
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免去了傳統(tǒng)的runloop影響,不需要關(guān)心銷(xiāo)毀問(wèn)題,不需要關(guān)心Scrollview滑動(dòng)問(wèn)題。