文章目录
一、 Rx 介绍
1、什么是Rx
Rx 是 ReactiveX 的缩写,简单来说就是基于异步 Event 序列的响应式编程。Rx 可以简化异步编程方法,并提供更优雅的数据绑定,让我们可以时刻响应新的数据的同时,顺序地处理他们。
2、RxSwift
在编程过程中,我们经常需要去检测某些值的变化(如:textfield 输入变化),然后进行相应的处理。RxSwift 的出现,让程序里的时间传递响应方法做到了统一,将之前常用的事件传递方法(ru delegate、notification、target-action等),全部替换成 Rx 的“信号链”方式。
在 MVVM 的开发模式下,可以通过 RxSwift 获得更加方便的数据绑定方法,让 MVVM 更加灵活轻便。
3、RxCocoa
RxCocoa 是 RxSwift 的一部分,主要是 UI 相关的 Rx 封装。RxCocoa 实现了很多组件的绑定,协助开发者把值和控件进行绑定,避免代码中产生大量的通知、代理、数据修改等代码。也可以监听 delegate,无需把控件创建和 delegate 处理分开。
二、Rx 常见用法
1、给 button 添加点击事件(RxCocoa)
在之前,当我们需要给button添加一个点击事件的时候,得这么干:
button.addTarget(self, action: #selector(buttonClicked), for: .touchUpInside)
@objc func buttonClicked() {
...
}
在使用 RxCocoa 之后,只需这样写:
button.rx.tap
.subscribe { _ in // 订阅点击事件信号
print("clicked button")
}
.disposed(by: disposeBag) //
// RxSwift tap 源码
extension Reactive where Base: UIButton {
/// Reactive wrapper for `TouchUpInside` control event.
public var tap: ControlEvent<Void> {
return controlEvent(.touchUpInside)
}
}
2、事件 + bind + combine
- share(replay: 1):共享同一个源,不单独创建新的源,以减少不必要的开支;
- orEmpty:将可选值的 nil 转化为空字符串输出,以减少可选类型隐式解包;
- bind:用来将一个信号发送者和一个信号监听者绑定在一起,即有信号发送,监听者自动收到通知;
- combine:信号融合
func rxCombine() {
let accountValid = accountTextField.rx.text.orEmpty
.map {
$0.count >= 5
}.share(replay: 1)
// 用 accountValid 来控制用户名提示语是否隐藏以及密码输入框是否可用。shareReplay 就是让他们共享这一个源,而不是为他们单独创建新的源。这样可以减少不必要的开支。
let passwordValid = passwordTextField.rx.text.orEmpty.map {
$0.count >= 5
}.share(replay: 1)
let everythingValid = Observable.combineLatest(accountValid, passwordValid) {
$0 && $1
}.share(replay: 1)