Variable
在 Swift 中我们经常会用 var 关键字来声明变量。RxSwift 提供的 Variable 实际上是 var 的 Rx 版本,你可以将它看作是 RxVar。
我们来对比一下 var 以及 Variable 的用法:
使用 var:
1. // 在 ViewController 中
2. var model: Model? = nil {
3. didSet { updateUI(with: model) }
4. }
6. override func viewDidLoad() {
7. super.viewDidLoad()
9. model = getModel()
10. }
12. func updateUI(with model: Model?) { ... }
13. func getModel() -> Model { ... }
使用 Variable:
1. // 在 ViewController 中
2. let model: Variable<Model?> = Variable(nil)
4. override func viewDidLoad() {
5. super.viewDidLoad()
7. model.asObservable()
8. .subscribe(onNext: { [weak self] model in
9. self?.updateUI(with: model)
10. })
11. .disposed(by: disposeBag)
13. model.value = getModel()
14. }
16. func updateUI(with model: Model?) { ... }
17. func getModel() -> Model { ... }
第一种使用 var 的方式十分常见,在 ViewController 中监听 Model 的变化,然后刷新页面。
第二种使用 Variable 则是 RxSwift 独有的。Variable 几乎提供了 var 的所有功能。另外,加上一条非常重要的特性,就是可以通过调用 asObservable() 方法转换成序列。然后你可以对这个序列应用操作符,来合成其他的序列。所以,如果我们声明的变量需要提供 Rx 支持,那就选用 Variable 这个类型。
说明
Variable 封装了一个 BehaviorSubject,所以它会持有当前值,并且 Variable 会对新的观察者发送当前值。它不会产生 error 事件。Variable 在 deinit 时,会发出一个 completed 事件。
