該篇主要講述RxSwift的簡介以及常用的使用方式,簡單的體驗一把Rx的神奇之處
一、簡介
ReactiveX(簡寫:Rx)是一個可以幫助我們簡化非同步程式設計的框架。而 RxSwift 是 Rx 的 Swift 版本。除了 RxSwift,還有 RxJava、RxJS、Rx.Net 等,對應的OC 版本則是 RAC(ReactiveCocoa),這裡是 RxSwift 的 github 地址
Rx的特點:
- 複合 - Rx 就是複合的代名詞
- 複用 - 因為它易複合
- 清晰 - 因為宣告都是不可變更的
- 易用 - 因為它抽象的了非同步程式設計,使我們統一了程式碼風格
- 穩定 - 因為 Rx 是完全通過單元測試的
二、RxSwift的常見使用
1.button的事件響應
let disposeBag = DisposeBag()
func setupButton() {
button.rx.tap
.subscribe(onNext: { () in
print("點了我")
})
.disposed(by: disposeBag)
}
複製程式碼
2.事件繫結
func setupTextField() {
textField.rx.text
.bind(to: textLabel.rx.text)
.disposed(by: disposeBag)
}
複製程式碼
3.KVO
注意:Swift是一門靜態語言,而KVO需要Runtime,所以需要宣告 @objc dynamic ,告訴系統使用該變數時使用OC方式,OC是動態語言。
import UIKit
class Person: NSObject {
@objc dynamic var name:String = "lgh";
}
複製程式碼
var disposeBag = DisposeBag()
var person:Person = Person()
func setupKVO(){
person.rx.observeWeakly(String.self, "name")
.subscribe(onNext: { (value) in
print(value! as String)
})
.disposed(by: disposeBag)
}
複製程式碼
4.通知(鍵盤彈起的通知)
var disposeBag = DisposeBag()
func setupNotification(){
NotificationCenter.default.rx.notification(UIResponder.keyboardWillShowNotification)
.subscribe(onNext: { (notification) in
print(notification)
})
.disposed(by: disposeBag)
}
複製程式碼
5.代理
var disposeBag = DisposeBag()
func setupScrollerView(){
mainScrollView.rx.contentOffset
.subscribe(onNext: { [weak self](offset) in
self?.view.backgroundColor = UIColor.init(red: (255-offset.y)/255*0.8, green: (255-offset.y)/255*0.6, blue: (255-offset.y)/255*0.3, alpha: 1)
}).disposed(by: disposeBag)
}
複製程式碼
6.定時器
var disposeBag = DisposeBag()
var timer: Observable<Int>!
func setupTimer(){ //實現原理?
timer = Observable<Int>.interval(1, scheduler: MainScheduler.init())
timer.subscribe(onNext: { (num) in
print("定時器:\(num)")
}).disposed(by: disposeBag)
}
複製程式碼
7.網路請求
var disposeBag = DisposeBag()
func setupNetwork() {
let url = URL(string: "https://www.163.com")
URLSession.shared.rx.response(request: URLRequest(url: url!))
.subscribe(onNext: { (response,data) in
print(String.init(data: data, encoding: .utf8))
}, onError: { (error) in
print(error)
}).disposed(by: disposeBag)
}
複製程式碼
三、RxSwift核心
- 1.建立序列 create
- 2.訂閱訊號
- 3.傳送訊號
// 1:建立序列
// AnonymousObservable -> producer.subscriber -> run
let ob = Observable<Any>.create { (obserber) -> Disposable in
// 3:傳送訊號
obserber.onNext("傳送訊號")
obserber.onCompleted()
return Disposables.create()
}
// 2:訂閱訊號
let _ = ob.subscribe(onNext: { (text) in
print("訂閱到:\(text)")
}, onError: { (error) in
print("錯誤: \(error)")
}, onCompleted: {
print("完成")
}) {
print("銷燬")
}
複製程式碼
思考:
為何寫法沒有點選響應效果
var disposeBag = DisposeBag()
func setupButton() {
button.rx.tap
.subscribe(onNext: { () in
print("點了我")
})
.disposed(by: DisposeBag())
}
複製程式碼
原因:臨時變數DisposeBag()釋放了