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 可以监听值变化事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值