美文网首页
结合操作符:startWith、merge、zip、combin

结合操作符:startWith、merge、zip、combin

作者: FallPine | 来源:发表于2018-09-05 15:15 被阅读38次
    • 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等)

    相关文章

      网友评论

          本文标题:结合操作符:startWith、merge、zip、combin

          本文链接:https://www.haomeiwen.com/subject/fluawftx.html