前言
本章中主要介紹數學和一些綜合運算符,操作是作用于整個觀察序列的元素
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(??)