RXSwift - flatMap flatMapLast
2020-08-22 本文已影响0人
内蒙小猿
因为现实中很多事件都是异步发生的,而并不是像Observable.of创建的看起来像集合这样的。因此,当我们需要对异步发生的事件序列进行变换的时候,就需要订阅原来的事件序列,对异步发生的事件有所察觉。其中,网络编程就是一个最典型的例子。为了在请求一个网络资源后,根据服务器返回的结果对原事件序列进行变换,flatMap就是最好的选择。
enum E : Error {
case demoAError
case demoBError
}
struct Player {
var score: BehaviorRelay<Int>
}
flatMap :1、把序列中的事件变成新的Observable 2、合并所有转换过的序列
let bag = DisposeBag()
let John = Player (score: BehaviorRelay (value: 70))
let Jole = Player (score: BehaviorRelay (value: 90))
let players = PublishSubject<Player>()
players.asObserver().flatMap { (player:Player) -> Observable<Int> in
player.score.asObservable()
}.subscribe(onNext: { (num) in
print(num)
}, onError: { (_) in
print("Error")
}, onCompleted: {
print("onCompleted")
}) {
print("onDisposed")
}.disposed(by: bag)
players.onNext(John)
John.score.accept(75)
players.onNext(Jole)
John.score.accept(85)
执行过程
----------John-----------------------Jole------------------------------------
flatMap{ $0.score.asObservable() }
-----------70------------75---------------------------85---------------------
--------------------------------------90-------------------------------------
-----------70------------75-----------90--------------85----------------------
note
-
flatMap 会把原序列中事件,转变成observable。当最早的 John 加入后, 把John 中的事件转换成observable (介绍部分 1 ), 紧接着 Jole 加入, flatMap 同样把他的事件也转换成了 Observable, 并把两个 Observable<Int> 合并(介绍部分 2)。
-
John, 70 是初始化的值,75是第一个 accept 的值,它属于 John observable
-
Jole, 90 是初始化值吗,它属于 Jole observable
-
flatMap 合并了 John 和 Jole 两个observable , 所以 John accpet 85 , 还是能接受到信号的。
flatMapLast:当原序列有新的事件发生的时候,flatMapLast 会自动取消上一个事件的订阅,转到新的事件的订阅上面, flatMap则会订阅全部。
let bag = DisposeBag()
let John = Player (score: BehaviorRelay (value: 70))
let Jole = Player (score: BehaviorRelay (value: 90))
let players = PublishSubject<Player>()
players.asObserver().flatMapLatest { (player:Player) -> Observable<Int> in
player.score.asObservable()
}.subscribe(onNext: { (num) in
print(num)
}, onError: { (_) in
print("Error")
}, onCompleted: {
print("onCompleted")
}) {
print("onDisposed")
}.disposed(by: bag)
players.onNext(John)
John.score.accept(75)
players.onNext(Jole)
John.score.accept(85)
执行过程
----------John-----------------------Jole------------------------------------
flatMapLatest{ $0.score.asObservable() }
-----------70------------75---------------------------85---------------------
--------------------------------------90-------------------------------------
-----------70------------75------------90--------------------------------------
note
- 70、 75 是属于 John Observable<Int>, flatMapLast 当前监听的就是 John Observable<Int>
- 90、 是属于 Jole Observable<Int>, flatMapLast 当前监听的就是 John Observable<Int> , 就会取消对 John Observable<Int> 监听