RxSwift-初探

函數(shù)響應(yīng)式編程

一:函數(shù)式

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

函數(shù)式編程的一個特點就是:允許把函數(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)
                  }
            }
        }
  • 上面的代碼嵌套層次之深,代碼過多
  • 代碼的可讀性也是非常差的
  • 代碼復(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 == 0 }
            .forEach { print($0) }
  • 代碼層次非常清晰
  • 代碼可讀性高
  • 代碼復(fù)用性高
  • 代碼簡潔

二:響應(yīng)式

對象對某一數(shù)據(jù)流變化做出響應(yīng)的這種編碼方式稱為響應(yīng)式。例如你在某一個時刻訂閱了一部小說,后面這個小說一有更新,我們隨著時間也能自定接受推送,這就是響應(yīng)

RxSwift使用

RxSwift對使用Swift的幫助有如下幾點:

Swift為值類型,在傳值與方法回調(diào)上有影響,RxSwift一定程度上彌補(bǔ)Swift的靈活性

  • RxSwift使得代碼復(fù)用性較強(qiáng),減少代碼量
  • RxSwift因為聲明都是不可變更,增加代碼可讀性
  • RxSwift使得更易于理解業(yè)務(wù)代碼,抽象異步編程,統(tǒng)一代碼風(fēng)格
  • RxSwift使得代碼更易于編寫集成單元測試,增加代碼穩(wěn)定性

一:button點擊事件

let disposeBag = DisposeBag()
//MARK: - RxSwift應(yīng)用-button響應(yīng)
func setupButton() {
    // 傳統(tǒng)事件
    self.button.addTarget(self, action: #selector(didClickButton), for: .touchUpInside)

    // Rx寫法
    self.button.rx.tap
        .subscribe(onNext: { [weak self] in
            print("點了btn")
            self?.view.backgroundColor = UIColor.orange   
        })
        .disposed(by: disposeBag) 

   self.button.rx.controlEvent(.touchUpOutside)
}

二: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效果來說,如果原生實現(xiàn)必將做很多惡心的處理:addTarget或者實現(xiàn)代理, 但是在RxSwift的世界里只需要一句代碼,真是萬物皆Rx

四: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: { (value) in
        print(value as Any)
    }).disposed(by: disposeBag)
}
  • 原生KVO就需要三部曲,非常惡心,其實對于我們開發(fā)來說根本沒必要!RxSwift還是一句代碼搞定,牛逼!

五:通知

//MARK: - 通知
func setupNotification(){
    NotificationCenter.default.rx
        .notification(UIResponder.keyboardWillShowNotification)
        .subscribe { (noti) in
            print(noti)
    }.disposed(by: disposeBag)
}
  • 通知的實現(xiàn),也是比較友善的:編程習(xí)慣都有在RxSwift風(fēng)格里面保留

六:手勢

//MARK: - 手勢
func setupGestureRecognizer(){
    let tap = UITapGestureRecognizer()
    self.label.addGestureRecognizer(tap)
    self.label.isUserInteractionEnabled = true
    tap.rx.event.subscribe { (event) in
         print(event.view)
    }.disposed(by: disposeBag)  
}
  • 很多小伙伴可能會吐槽手勢怎么不那么爽!其實你誤解,RxSwift是實現(xiàn)的響應(yīng)關(guān)系,本身手勢也是需要添加事件對象的!

七:網(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)
}

八: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實現(xiàn)的timer免去了我們計時器的一些不必要的麻煩
  • runloop影響
  • 銷毀問題
  • 線程問題

RxSwift無論從代碼量,還是從代碼的可讀性,抑或代碼的復(fù)用性......都是大大優(yōu)化!讓開發(fā)者拋棄更多的膠水代碼,直面開發(fā)需求。

?著作權(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ù)。

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

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