MVVM 的 BehaviorRelay 和 Driver

BehaviorRelay 实际上是 Variable 的替代。概念上和 Variable 并无区别。而 Variable 是对 BehaviorSubject的封装,因此它可以不停地监听值的变化并发送事件。此外 Variable 会将当前值缓存值它的 value 属性中,你可以用 .value 的方式读取 Variable 的当前值,通过 accept() 方法修改当前值。

Driver 是一种特殊的 Observable。它有3个特点:

  1. 不会产生 error 事件
  2. 一定在主线程监听(MainScheduler)
  3. 共享状态变化(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 可以监听值变化事件。

你可能感兴趣的:(iPhone开发)