该篇主要讲述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()释放了