RxSwift文档翻译6 -- Mathematical and Aggregate Operators

前言

本章中主要介绍数学和一些综合运算符,操作是作用于整个观察序列的元素

Mathematical and Aggregate Operators

  • toArray
    将观察序列多个元素转换为单个元素的序列,这个元素就是源序列元素的数组集合
example("toArray") {
      let disposeBag = DisposeBag()
      Observable.range(start: 1, count: 10)
                .toArray()
                .subscribe { print($0) }
                .disposed(by: disposeBag)
        }

// 控制台打印的结果:
--- toArray example ---
next([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
completed
  • reduce
    类似于scan,有一个种子值和一个操作符,对种子值作为第一个值与第一个元素进行计算,结果作为新的种子值与第二个元素进行计算。与scan不用的是,reduce的是取最后一个计算结果作为新的序列的元素
example("reduce") {
    let disposeBag = DisposeBag()
    
    Observable.of(10, 100, 1000)
        .reduce(1, accumulator: +)
        .subscribe(onNext: { print($0) })
        .disposed(by: disposeBag)
}

// 控制台打印的结果:
--- reduce example ---
1111
  • concat
    用于多个序列的事件元素的链接,按照顺序的方式进行连接,当一个序列的元素连接完毕并结束后在链接下一个序列

本文作者注:我所理解的结束,应该是序列发出Complete事件或者Error事件,并且在官方实例中子序列用的是BehaviorSubject,仅发出最近的元素,所以在比如A序列在前,B序列在后,B发出b1, b2两个元素,然后A Complete,由于b2是最近的元素,所以在链接的时候b1就会被忽略了*

example("concat") {
    let disposeBag = DisposeBag()
    
    let subject1 = BehaviorSubject(value: "🍎")
    let subject2 = BehaviorSubject(value: "🐶")
    
    let variable = Variable(subject1)
    
    variable.asObservable()
        .concat()
        .subscribe { print($0) }
        .disposed(by: disposeBag)
    
    subject1.onNext("🍐")
    subject1.onNext("🍊")
    
    variable.value = subject2
    
    subject2.onNext("I would be ignored")
    subject2.onNext("🐱")
    
    subject1.onCompleted()
    
    subject2.onNext("🐭")
}

// 控制台打印的结果:
--- concat example ---
next(🍎)
next(🍐)
next(🍊)
next(🐱)
next(🐭)

下一篇:RxSwift文档翻译7 - Connectable Operators

推荐阅读更多精彩内容