转换可观察队列发出的Next事件里元素的操作
map
将转换闭包应用于可观察序列发出的元素,并返回已转换元素的一个新的可观察序列。
let disposeBag = DisposeBag()
Observable.of(1, 2, 3)
.map { $0 * $0 }
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
flatMap and flatMapLatest
还记得之前的switchLatest
么flatMapLatest
就是map
跟switchLatest
的组合,flatMap
就是把Latest
去掉。
官方解释是这样的:将Observable
队列发出的元素转换成一个新的可观察队列,并将两者的输出组合成一个新的可观察队列,意思就是说会监听原队列,也会监听你闭包中转换过的队列。flatMapLatest
不同的就是会监听最近的队列。(队列被改掉了)
let disposeBag = DisposeBag()
struct Player {
var score: Variable<Int>
}
let 👦🏻 = Player(score: Variable(80))
let 👧🏼 = Player(score: Variable(90))
let player = Variable(👦🏻)
player.asObservable()
.flatMap { $0.score.asObservable() } // Change flatMap to flatMapLatest and observe change in printed output
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
👦🏻.score.value = 85 // 会有响应
player.value = 👧🏼 // 这边也会有响应 监听了两个组合队列
👦🏻.score.value = 95 // Will be printed when using flatMap, but will not be printed when using flatMapLatest
👧🏼.score.value = 100
scan
以初始值开始,然后将一个累加器闭包应用于可观察序列所发射的每个元素,并将每个中间结果作为一个元素可观察序列返回。看例子
let disposeBag = DisposeBag()
Observable.of(10, 100, 1000)
.scan(1) { aggregateValue, newValue in // aggregateValue 之前返回的值
aggregateValue + newValue
}
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag) // 11,111,1111