结合操作符: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()
let subject2 = PublishSubject()
 
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()
let subject2 = PublishSubject()
 
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()
let subject2 = PublishSubject()
 
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等)

你可能感兴趣的:(结合操作符:startWith、merge、zip、combineLatest、withLatestFrom、switchLatest)