结合操作符:startWith、merge、zip、combineLatest、withLatestFrom、switchLatest

  • startWith

    该方法会在 Observable 序列开始之前插入一些事件元素。即发出事件消息之前,会先发出这些预先插入的事件消息
Observable.of("3", "4")
    .startWith("1", "2")
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)

// 这样也能添加多个元素
Observable.of("3", "4")
    .startWith("1")
    .startWith("2")  // 后加入的会在前面
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)
  • merge

    该方法可以将多个(两个或两个以上的)Observable 序列合并成一个 Observable 序列
let subject1 = PublishSubject<Int>()
let subject2 = PublishSubject<Int>()
 
Observable.of(subject1, subject2)
    .merge()
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)
 
subject1.onNext(20)
subject1.onNext(40)
subject1.onNext(60)
subject2.onNext(1)
subject1.onNext(80)
subject1.onNext(100)
subject2.onNext(1)
  • zip

    该方法可以将多个(两个或两个以上的)Observable 序列压缩成一个 Observable 序列,而且它必须等到每个 Observable 事件一一对应地凑齐之后再合并
Observable.zip(subject1, subject2) { (num, str) -> String in
            return "\(num)" + str
        }
            .observeOn(MainScheduler.instance)    // 加这个是为了回到主线程执行
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)
        
        subject1.onNext(1)
        subject2.onNext("A")
        subject1.onNext(2)
        subject2.onNext("B")

附:zip 常常用在整合网络请求上。
比如我们想同时发送两个请求,只有当两个请求都成功后,再将两者的结果整合起来继续往下处理。这个功能就可以通过 zip 来实现

  • combineLatest

    该方法同样是将多个(两个或两个以上的)Observable 序列元素进行合并,但与 zip 不同的是,每当任意一个 Observable 有新的事件发出时,它会将每个 Observable 序列的最新的一个事件元素进行合并,即会把多个Observable的最新的值进行合并
let subject1 = PublishSubject<Int>()
let subject2 = PublishSubject<String>()
 
Observable.combineLatest(subject1, subject2) {
    "\($0)\($1)"
    }
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)
 
subject1.onNext(1)
subject2.onNext("A")
subject1.onNext(2)
subject2.onNext("B")
  • withLatestFrom

    该方法将两个 Observable 序列合并为一个。每当主队列发射一个元素时,便从第二个序列中取出最新的一个值
let subject1 = PublishSubject<String>()
let subject2 = PublishSubject<String>()
 
subject1.withLatestFrom(subject2)
    .subscribe(onNext: { print($0)  // 打印subject2的内容 })
    .disposed(by: disposeBag)
 
subject1.onNext("A")
subject2.onNext("1")
subject1.onNext("B")
subject1.onNext("C")
subject2.onNext("2")
subject1.onNext("D")
  • switchLatest

    switchLatest 有点像其他语言的 switch 方法,可以对事件流进行转换
    比如本来监听的 subject1,我可以通过更改 variable 里面的 value 更换事件源。变成监听 subject2
let subject1 = BehaviorSubject(value: "A")
let subject2 = BehaviorSubject(value: "1")
 
let variable = Variable(subject1)
 
variable.asObservable()
    .switchLatest()
    .subscribe(onNext: { print($0) })
    .disposed(by: disposeBag)
 
subject1.onNext("B")
subject1.onNext("C")
 
//改变事件源
variable.value = subject2
subject1.onNext("D")
subject2.onNext("2")
 
//改变事件源
variable.value = subject1
subject2.onNext("3")
subject1.onNext("E")

参考文章:Swift - RxSwift的使用详解11(结合操作符:startWith、merge、zip等)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容