BehaviorRelay 实际上是 Variable 的替代。概念上和 Variable 并无区别。而 Variable 是对 BehaviorSubject的封装,因此它可以不停地监听值的变化并发送事件。此外 Variable 会将当前值缓存值它的 value 属性中,你可以用 .value 的方式读取 Variable 的当前值,通过 accept() 方法修改当前值。
Driver 是一种特殊的 Observable。它有3个特点:
- 不会产生 error 事件
- 一定在主线程监听(MainScheduler)
- 共享状态变化(shareReplayLatestWhileConnected)
将 Observable 转换为 Driver 使用 asDriver() 方法,Driver 转换为 Observable 使用 asObservable() 方法。
通过 driver()方法,可以将 Driver 对象的值绑定到 UI 对象属性上。
在 MVVM 中,往往通过上述二者来实现 ViewModel 的双向绑定。
首先,定义一个 BehaviorRelay 实例变量:
var _dateRange: BehaviorRelay<[Date]?> = BehaviorRelay(value: nil)
然后定义一个 Driver 属性,它实际上是由 _dateRange 转换来的:
var dateRange: Driver<[Date]?> {
return _dateRange.asDriver().distinctUntilChanged()
}
然后对 dateRange 进行监听:
dateRange.asObservable().subscribe(onNext: { [weak self] dateRange in
guard let self = self else { return }
if dateRange.isEmpty {
...
} else {
...
}
}).disposed(by: bag)
修改 dateRange 值使用 accept 方法:
_dateRange.accept(dates)
读取 dateRange 值使用 _dateRange.value 属性。
简单说,BehaviorRelay 可以看成是一个属性的存储对象,可以通过它直接访问相关值, Driver 则是和该值所对应的可观察对象,通过 Driver 可以监听值变化事件。