Variable

Swift 中我们经常会用 var 关键字来声明变量。RxSwift 提供的 Variable 实际上是 varRx 版本,你可以将它看作是 RxVar。

我们来对比一下 var 以及 Variable 的用法:

使用 var:

  1. // 在 ViewController 中
  2. var model: Model? = nil {
  3. didSet { updateUI(with: model) }
  4. }
  5. override func viewDidLoad() {
  6. super.viewDidLoad()
  7. model = getModel()
  8. }
  9. func updateUI(with model: Model?) { ... }
  10. func getModel() -> Model { ... }

使用 Variable:

  1. // 在 ViewController 中
  2. let model: Variable<Model?> = Variable(nil)
  3. override func viewDidLoad() {
  4. super.viewDidLoad()
  5. model.asObservable()
  6. .subscribe(onNext: { [weak self] model in
  7. self?.updateUI(with: model)
  8. })
  9. .disposed(by: disposeBag)
  10. model.value = getModel()
  11. }
  12. func updateUI(with model: Model?) { ... }
  13. func getModel() -> Model { ... }

第一种使用 var 的方式十分常见,在 ViewController 中监听 Model 的变化,然后刷新页面。

第二种使用 Variable 则是 RxSwift 独有的。Variable 几乎提供了 var 的所有功能。另外,加上一条非常重要的特性,就是可以通过调用 asObservable() 方法转换成序列。然后你可以对这个序列应用操作符,来合成其他的序列。所以,如果我们声明的变量需要提供 Rx 支持,那就选用 Variable 这个类型。

说明

Variable 封装了一个 BehaviorSubject,所以它会持有当前值,并且 Variable 会对新的观察者发送当前值。它不会产生 error 事件。Variabledeinit 时,会发出一个 completed 事件。