如何读取RxSwift中Driver<Bool>类型属性的当前值,无需订阅变更事件?
RxSwift的Driver属于响应式序列,本身没有直接暴露当前值的读取接口,你可以通过两种常用方案实现需求:
方案一:不修改现有属性定义,使用take(1)操作符
该方案仅会订阅序列的第一个值,获取到值后自动结束订阅,不会响应后续的变更:
roomStatus.checkInEnabled .take(1) .drive { [weak self] enabled in guard let self = self, !enabled else { return } // 此处逻辑仅会执行一次 } .disposed(by: disposeBag)
注意:如果当前checkInEnabled还没有发射过任何值,该订阅会等到第一个值产生时才触发逻辑,不会立刻执行。
方案二:修改属性底层实现,直接暴露当前值
如果你需要频繁读取该属性的即时值,推荐用BehaviorRelay作为底层存储,它会持有最新的状态值,可直接同步读取:
// 内部私有存储,初始值根据业务需求设置 private let _checkInEnabled = BehaviorRelay<Bool>(value: false) // 对外保留原有的Driver接口,兼容原有逻辑 var checkInEnabled: Driver<Bool> { _checkInEnabled.asDriver() } // 新增同步读取当前值的计算属性 var isCheckInEnabled: Bool { _checkInEnabled.value }
调整后你就可以用你想要的写法直接执行逻辑:
if !roomStatus.isCheckInEnabled { // 仅在当前位置执行一次逻辑,无订阅逻辑 }
不推荐使用
toBlocking()的方式阻塞读取值,大概率会导致主线程卡住,引发崩溃或卡顿问题。
内容的提问来源于stack exchange,提问作者Code
相关产品推荐
相关产品推荐

