RxSwift <1> —— 初探

廢話不多說(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)行異步編程的編程接口。


2257417-8a63113cba6f9aec.png

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)題。

最后編輯于
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 就問(wèn)此時(shí)此刻還有誰(shuí)?45度仰望天空,該死!我這無(wú)處安放的魅力!RxSwift(1)—— 初探RxSwift(2)—...
    Cooci_和諧學(xué)習(xí)_不急不躁閱讀 4,888評(píng)論 10 34
  • 前言 寫(xiě)這篇文章是為了記錄下自己在對(duì)于RxSwift的學(xué)習(xí)過(guò)程中的概念理解,操作步驟以及心得體會(huì),以便于在以后復(fù)習(xí)...
    Henry_Jeannie閱讀 522評(píng)論 0 3
  • 通過(guò)幾個(gè)例子 體現(xiàn)一下RxSwift的逼格有多高 ------Button 添加事件: 實(shí)現(xiàn)事件: 直接用RxSw...
    BoxJing閱讀 706評(píng)論 0 3
  • 古子萱閱讀 294評(píng)論 0 0
  • 圖文/馨雅百合 遠(yuǎn)眺群山容顏換 積雪覆蓋顯壯觀 近看峭壁掛冰劍 偉岸圣潔胸襟寬 2019.1.27
    馨晴百合閱讀 251評(píng)論 3 12

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