1. 什么是RxSwift
RxSwift是Swift函数响应式编程的一个开源库,由Github的ReactiveX组织开发、维护
RxSwift的目的是:让数据/事件流 和 异步任务能够更方便的序列化处理,能够使用Swift进行响应式编程
RxSwift本质上还是观察者模式,并且是一个响应式的,并且可以序列化的
观察者模式
观察者模式包括:KVO、通知等
爸爸妈妈照看观察宝宝
其中,宝贝就是被观察者
爸爸妈妈就是观察者,或者说是订阅者
只要被观察者(宝宝)发出来某些事件,比如哭声、叫声,则被称为事件,通知到订阅者
此时,订阅者就可以做响应的工作
RxSwift做了什么?
RxSwift把我们程序中的每一个操作都看成一个事件
比如一个TextField中的文本改变、一个按钮被点击、一个网络请求结束等
每一个事件源就可以看成一个管道,也就是sequence
比如,TextField,当我们改变里面的文本的时候,这个TextField就会不断的发出事件
从他的sequence中不断流出,我们只需要监听这个sequence,每流出一个事件就做相应的处理
同理,Button也是一个sequence,每点击一次就流出一个事件
理解Observable和Observer

2. RxSwift简单体验
- RxSwift监听按钮的点击
- RxSwift监听UITextField的文字改变
- RxSwift改变Label中的文字
- RxSwift监听对象属性改变
- RxSwift监听UIScrollView的滚动
- …
//导入RxSwift
import RxSwift
import RxCocoa
按钮监听
原始方法:
button.addTarget(self, action: #selector(button1Click), for: .touchUpInside)
使用RxSwift的方法:
self.button.rx.tap.subscribe {
(event: Event<Void>) in
print(event)
}
上述方法会有一个标黄的警告:Result of call to ‘subscribe’ is unused
修改方法:private lazy var disposeBag: DisposeBag = DisposeBag() self.button.rx.tap.subscribe { (event: Event<Void>) in print(event) }.disposed(by: disposeBag)```
监听UITextField文字的改变
方法一:传统方法
略
方法二:
self.view.addSubview(self.textField)
self.textField.frame = CGRect(x: 200, y: 300, width: 100, height: 40)
self.textField.rx.text.subscribe {
(event: Event<String?>) in
print(event.element)//获取信息
}.disposed(by: disposeBag)
这种方法,获取的event有两个Optional包裹着,使用起来不方便
方法三:
self.textField.rx.text.subscribe {
(myString: String?) in
print(myString)//获取的是Optional类型
} onError: {
error in
print(error)
} onCompleted: {
print("onCompleted")
} onDisposed: {
print("onDisposed")
}.disposed(by: disposeBag)
以上可以简化:
self.textField.rx.text.subscribe {
(myString: String?) in
print(myString)//获取的是Optional类型
}.disposed(by: disposeBag)
监听Label中的文字
UITextField文字输入,然后Label显示输入的文字
方法一:
self.textField.rx.text.subscribe {
(myString: String?) in
print(myString)
self.myTitleLabel.text = myString
}.disposed(by: disposeBag)
self.view.addSubview(myTitleLabel)
myTitleLabel.frame = CGRect(x: 100, y: 210, width: 200, height: 40)
方法二:
self.textField.rx.text
.bind(to: myTitleLabel.rx.text)
.disposed(by: disposeBag)
self.view.addSubview(myTitleLabel)
myTitleLabel.frame = CGRect(x: 100, y: 210, width: 200, height: 40)
RxSwift的KVO
self.view.addSubview(myTitleLabel)
myTitleLabel.frame =


3876

被折叠的 条评论
为什么被折叠?



