Rx 操作符七

Posted liuxiaokun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rx 操作符七相关的知识,希望对你有一定的参考价值。

  • timeout

技术图片

如果源 Observable 在规定时间内没有发出任何元素,就产生一个超时的 error 事件

技术图片

如果 Observable 在一段时间内没有产生元素,timeout 操作符将使它发出一个 error 事件。

  • timer

创建一个 Observable 在一段延时后,产生唯一的一个元素

timer 操作符将创建一个 Observable,它在经过设定的一段时间后,产生唯一的一个元素。

这里存在其他版本的 timer 操作符。

技术图片

创建一个 Observable 在一段延时后,每隔一段时间产生一个元素

public static func timer(
  _ dueTime: RxTimeInterval,  // 初始延时
  period: RxTimeInterval?,    // 时间间隔
  scheduler: SchedulerType
  ) -> Observable<E>
  • using

创建一个可被清除的资源,它和 Observable 具有相同的寿命

技术图片

通过使用 using 操作符创建 Observable 时,同时创建一个可被清除的资源,一旦 Observable 终止了,那么这个资源就会被清除掉了。

  • window

将 Observable 分解为多个子 Observable,周期性的将子 Observable 发出来

window 操作符和 buffer 十分相似,buffer 周期性的将缓存的元素集合发送出来,而 window 周期性的将元素集合以 Observable 的形态发送出来。

buffer 要等到元素搜集完毕后,才会发出元素序列。而 window 可以实时发出元素序列。

  • withLatestFrom

将两个 Observables 最新的元素通过一个函数组合起来,当第一个 Observable 发出一个元素,就将组合后的元素发送出来

技术图片

withLatestFrom 操作符将两个 Observables 中最新的元素通过一个函数组合起来,然后将这个组合的结果发出来。当第一个 Observable 发出一个元素时,就立即取出第二个 Observable 中最新的元素,通过一个组合函数将两个最新的元素合并后发送出去。

当第一个 Observable 发出一个元素时,就立即取出第二个 Observable 中最新的元素,然后把第二个 Observable 中最新的元素发送出去。

let disposeBag = DisposeBag()
let firstSubject = PublishSubject<String>()
let secondSubject = PublishSubject<String>()

firstSubject
     .withLatestFrom(secondSubject)
     .subscribe(onNext: { print($0) })
     .disposed(by: disposeBag)

firstSubject.onNext("???")
firstSubject.onNext("???")
secondSubject.onNext("1")
secondSubject.onNext("2")
firstSubject.onNext("??")

技术图片

当第一个 Observable 发出一个元素时,就立即取出第二个 Observable 中最新的元素,将第一个 Observable 中最新的元素 first 和第二个 Observable 中最新的元素second组合,然后把组合结果 first+second发送出去。

let disposeBag = DisposeBag()
let firstSubject = PublishSubject<String>()
let secondSubject = PublishSubject<String>()

firstSubject
     .withLatestFrom(secondSubject) {
          (first, second) in
          return first + second
     }
     .subscribe(onNext: { print($0) })
     .disposed(by: disposeBag)

firstSubject.onNext("???")
firstSubject.onNext("???")
secondSubject.onNext("1")
secondSubject.onNext("2")
firstSubject.onNext("??")

技术图片

  • zip

通过一个函数将多个 Observables 的元素组合起来,然后将每一个组合的结果发出来

技术图片

zip 操作符将多个(最多不超过8个) Observables 的元素通过一个函数组合起来,然后将这个组合的结果发出来。它会严格的按照序列的索引数进行组合。例如,返回的 Observable 的第一个元素,是由每一个源 Observables 的第一个元素组合出来的。它的第二个元素 ,是由每一个源 Observables 的第二个元素组合出来的。它的第三个元素 ,是由每一个源 Observables 的第三个元素组合出来的,以此类推。它的元素数量等于源 Observables 中元素数量最少的那个。

let disposeBag = DisposeBag()
let first = PublishSubject<String>()
let second = PublishSubject<String>()

Observable.zip(first, second) { $0 + $1 }
          .subscribe(onNext: { print($0) })
          .disposed(by: disposeBag)

first.onNext("1")
second.onNext("A")
first.onNext("2")
second.onNext("B")
second.onNext("C")
second.onNext("D")
first.onNext("3")
first.onNext("4")

技术图片

以上是关于Rx 操作符七的主要内容,如果未能解决你的问题,请参考以下文章

三分钟了解阿里云第七代高主频云服务器性能以及优势

阿里云服务器ECS第七代c7/g7/r7/c7t/g7ne/g7t/r7t参数性能详解!

阿里云服务器ECS第七代c7/g7/r7/c7t/g7ne/g7t/r7t参数性能详解!

爆了|第七代历途机器人大剧透

爆了|第七代历途机器人大剧透

Rx 操作符六