一、簡介
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)