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 事件。