You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何读取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 00:57:03