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,提问作者Ленивая Рыба
相关产品推荐
相关产品推荐

