RxSwift的使用

一、簡介

RxSwift的github地址
RxSwift官方文檔
RxSwift官方文檔中文翻譯

  • RxSwift是Swift函數(shù)響應式編程的一個開源庫,由Github的ReactiveX組織開發(fā)、維護
  • RxSwift的目的是讓數(shù)據(jù)/事件流和異步任務能夠更方便的序列化處理,能夠使用Swift進行響應式編程
  • RxSwift的本質(zhì)就是觀察者模式

二、RxSwif做了什么

  • RxSwif把我們程序中每一個操作都看成一個事件
  • 比如一個TextField中的文本改變,一個按鈕被點擊,或者一個網(wǎng)絡請
    求結(jié)束等,每一個事件源就可以看成一個管道,也就是sequence
  • 比如TextField,當我們改變里面的文本的時候,這個TextField就會不
    斷的發(fā)出事件,從他的這個sequence中不斷的流出,我們只需要監(jiān)聽
    這個sequence,每流出一個事件就做相應的處理。
  • 同理,Button也是一個sequence,每點擊一次就流出一 個事件。

二、cocoapods安裝RxSwift

pod 'RxSwift'
pod 'RxCocoa'

image.png

三、簡單使用

1.監(jiān)聽按鈕點擊

  • 傳統(tǒng)方式
button.addTarget(self, action: #selector(buttonClick), for: .touchUpInside)

@objc func buttonClick() {
   print("按鈕點擊")
}
  • RxSwift方式
button.rx.tap.subscribe { event in
    print("按鈕點擊")
}

但是這樣寫會報一個警告,意思是返回的結(jié)果未使用

警告.png

我們一般懶加載一個DisposeBag對象,然后在訂閱后面使用就可以消除這個警告。

lazy var bag: DisposeBag = DisposeBag()

button.rx.tap.subscribe { event in
  print("按鈕點擊")
}.disposed(by: bag)

2.監(jiān)聽輸入框文字變化

  • 傳統(tǒng)方式
// 設置代理
tf.delegate = self

// 代理方法
extension PBHomeViewController: UITextFieldDelegate {
    func textFieldDidChangeSelection(_ textField: UITextField) {
        print("文字變化:\(textField.text!)")
    }
}
  • RxSwift方式
tf.rx.text.subscribe { event in
  print("輸入變化:\(event.element!!)")
}.disposed(by: bag)
// 或者
tf.rx.text.subscribe (onNext: {string in
  print("輸入變化:\(string!)")
}).disposed(by: bag)

3.輸入框文字綁定到label上

tf.rx.text.bind(to: label.rx.text).disposed(by: bag)

4.監(jiān)聽屬性改變

  • 傳統(tǒng)方式
label.addObserver(self, forKeyPath: "text", options: .new, context: nil)
label.addObserver(self, forKeyPath: "frame", options: .new, context: nil)

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
   print((change?[.newKey])!)
}
  • RxSwift方式
label.rx.observe(String.self, "text").subscribe { event in
   print("文本改變:\(event.element!!)")
}.disposed(by: bag)

label.rx.observe(CGRect.self, "frame").subscribe { event in
    print("frame改變:\(event.element!!)")
}.disposed(by: bag)

5.監(jiān)聽滾動偏移

scrollView.rx.contentOffset.subscribe { point in
  print("滾動偏移:\(point.element!)")
}.disposed(by: bag)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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