01. Map
map
操作符将源Observable
的每个元素应用你提供的转换方法,然后返回含有转换结果的Observable
;
示例:将每一个元素X10
以后,生成一个新的Observable
, 并发出所有的元素;
func testMap() { let observable = Observable.of(1, 2, 3) let newObservable = observable.map { (value) -> Int in return value * 10 } newObservable.subscribe { (res) in Logger(res) }.disposed(by: disposeBag) }
运行结果:
Log - next(10) Log - next(20) Log - next(30) Log - completed
02. FlatMap
flatMap
操作符将源Observable
的每一个元素应用一个转换方法,将他们转换成Observables
。然后将这些Observables
的元素合并之后再发送出来;
示例:当Observable
的元素本身拥有其他的Observable
时,可以将所有子Observables
的元素发送出来;
func testFlatMap() { let observable = BehaviorSubject<Int?>(value: 1) let parentObservable = BehaviorRelay<BehaviorSubject<Int?>>(value: observable) let newObservable = parentObservable.asObservable().flatMap { value -> BehaviorSubject<Int?> in return value } newObservable.subscribe { (res) in Logger(res) }.disposed(by: disposeBag) Logger("flatMap - ended - 以下代码为演示flatMapLatest做对比") let observable2 = BehaviorSubject<Int?>(value: 2) parentObservable.accept(observable2) observable.onNext(3) }
运行结果:
Log - next(Optional(1)) Log - flatMap - ended - 以下代码为演示flatMapLatest做对比 Log - next(Optional(2)) Log - next(Optional(3))
Map
与FlatMap
的联系:都可以对元素进行转换,并且返回结果都是Observable
类型;
Map
与FlatMap
的区别:flatMap
针对的是将元素转换为Observable
并且闭包的返回值必须是Observable
;而map
更加偏向于对每一个元素的处理,对元素进行操作,闭包的返回值可以是任意类型;
03. FlatMapLatest
与flatMap
类似,主要是将Observable
的元素转换成其他的Observable
,然后取这些Observables
中最新的一个,具体是什么意思呢?看下面的示例:
func testflatMapLatest() { let observable = BehaviorSubject<Int?>(value: 1) let parentObservable = BehaviorRelay<BehaviorSubject<Int?>>(value: observable) let newObservable = parentObservable.asObservable().flatMapLatest { value -> BehaviorSubject<Int?> in return value } newObservable.subscribe { (res) in Logger(res) }.disposed(by: disposeBag) let observable2 = BehaviorSubject<Int?>(value: 2) parentObservable.accept(observable2) observable.onNext(3) }
运行结果:
Log - next(Optional(1)) Log - next(Optional(2))
通过对比flatMap
的运行结果Log
下面的代码可以看出元素3
当使用flatMapLatest
转换的时候,这个信号并未发出,也就是说当parentObservable
发出最新的元素的时候,flatMapLatest
一旦转换出一个新的Observable
,就只发出它的元素,旧的Observables
的元素将被忽略掉,而flatMap
是可以继续发出元素的;
04. Filter
仅仅发出Observable中
通过判定的元素;
func testFilter() { let observable = Observable.of(1, 2, 3) let newObservable = observable.filter { (value) -> Bool in return value % 2 == 0 } newObservable.subscribe { (res) in Logger(res) }.disposed(by: disposeBag) }
运行结果:
Log - next(2) Log - completed
filter
与map
的区别可简单理解为,map
是对元素的按照一定规则进行转换,filter
则是对元素的筛选,取出符合条件的元素,并发出;