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

RxSwift:Signal与Driver的行为差异疑问及示例求助

RxSwift Signal与Driver的行为差异解析

场景一问题原因

你使用的PublishRelay本身是不保留最新事件的序列,因此不管转成Driver还是Signal,订阅时都不会收到之前发送的"a"。Driver的“订阅时重播最新事件”特性,仅针对本身会保留最新值的序列(比如BehaviorRelay、BehaviorSubject)。

正确复现差异的示例

let bag = DisposeBag()
// 改用BehaviorRelay,它会持续保留最新值
var relay = BehaviorRelay<String>(value: "initial")

relay.accept("a")

// Driver订阅时会立即重播当前最新的"a"
relay.asDriver(onErrorJustReturn: "err").drive(onNext: { val in
    print("Driver:", val)
}).disposed(by: bag)

// Signal订阅时不会重播历史事件,仅接收订阅后的新事件
relay.asSignal(onErrorJustReturn: "err").emit(onNext: { val in
    print("Signal:", val)
}).disposed(by: bag)

relay.accept("b")
// 输出结果:
// Driver: a
// Driver: b
// Signal: b

场景二问题原因

textfield.rx.text是ControlProperty类型,它的特性是订阅时会自动发送当前控件的最新值。因此不管你转成Driver还是Signal,订阅时都会收到一次初始值(比如文本框默认的空字符串),两次订阅自然会打印两次"Here"——这不是Driver和Signal的差异,而是ControlProperty本身的行为。

核心差异总结

  • Driver:订阅时会重播序列的最新事件(仅当序列本身支持保留最新值时),默认在主线程执行,不会抛出错误。
  • Signal:订阅时不会重播任何历史事件,仅接收订阅后的新事件,同样默认在主线程执行,不会抛出错误。

内容的提问来源于stack exchange,提问作者Ленивая Рыба

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:13:20