RxSwift中如何监听多个Variable的.next事件且忽略值
解决RxSwift中监听多个Variable变化且忽略具体值的问题
首先,针对你的需求——监听多个Variable(或推荐的BehaviorRelay)的变化,且不需要获取具体值,同时希望以数组形式传入Observable,这里有两种常用方案,取决于你对触发时机的要求:
方案1:任意一个变量变化就触发(最符合"任何变化"的需求)
如果只要任意一个变量发生更新就执行逻辑,不管其他变量有没有更新过,用merge操作符是最合适的。步骤如下:
- 把每个
Variable.asObservable()都通过map转换成Observable<Void>,忽略具体值; - 将这些Void类型的Observable放到数组中;
- 用
Observable.merge()合并数组,订阅即可。
示例代码:
import RxSwift let disposeBag = DisposeBag() // 你的变量定义 let number = Variable<Int>(0) let text = Variable<String>("") // 扩展到10多个变量时,直接在数组中添加对应的Observable即可 let observableArray: [Observable<Void>] = [ number.asObservable().map { _ in }, text.asObservable().map { _ in } ] // 合并监听 Observable.merge(observableArray) .subscribe(onNext: { // 这里写变量变化时要执行的逻辑 print("某个变量发生了变化!") }) .disposed(by: disposeBag) // 测试:修改任意变量都会触发订阅 number.value = 5 text.value = "Hello"
额外优化:跳过初始值触发
如果你不想在订阅时就触发初始值的事件(因为Variable会默认发射初始值),可以加上skip(1):
Observable.merge(observableArray) .skip(1) .subscribe(onNext: { print("变量发生了更新(跳过初始值)") }) .disposed(by: disposeBag)
方案2:所有变量至少有一次值后,任意变化才触发
如果你需要确保**所有变量都已经有过值(包括初始值)**之后,再监听变化,那可以用combineLatest,同样配合map忽略具体值:
// 统一Observable类型为Any,因为不同类型的Variable无法直接放入combineLatest的数组 let observableArray: [Observable<Any>] = [ number.asObservable(), text.asObservable() ] Observable.combineLatest(observableArray) .map { _ in } // 忽略组合后的所有值 .subscribe(onNext: { print("某个变量变化了,且所有变量都已初始化") }) .disposed(by: disposeBag)
同样,如果不需要初始的组合触发,也可以加上skip(1)。
重要提示:Variable已被废弃,推荐使用BehaviorRelay
在RxSwift 5及以后的版本中,Variable已经被标记为废弃,官方推荐使用BehaviorRelay来替代,用法几乎一致,只是需要通过accept()方法修改值:
let numberRelay = BehaviorRelay<Int>(value: 0) let textRelay = BehaviorRelay<String>(value: "") let observableArray: [Observable<Void>] = [ numberRelay.asObservable().map { _ in }, textRelay.asObservable().map { _ in } ] Observable.merge(observableArray) .subscribe(onNext: { print("Relay发生了变化") }) .disposed(by: disposeBag) // 修改值的方式 numberRelay.accept(10) textRelay.accept("World")
内容的提问来源于stack exchange,提问作者SebKas
相关产品推荐
相关产品推荐

