因?yàn)楝F(xiàn)實(shí)中很多事件都是異步發(fā)生的,而并不是像Observable.of創(chuàng)建的看起來(lái)像集合這樣的。因此,當(dāng)我們需要對(duì)異步發(fā)生的事件序列進(jìn)行變換的時(shí)候,就需要訂閱原來(lái)的事件序列,對(duì)異步發(fā)生的事件有所察覺(jué)。其中,網(wǎng)絡(luò)編程就是一個(gè)最典型的例子。為了在請(qǐng)求一個(gè)網(wǎng)絡(luò)資源后,根據(jù)服務(wù)器返回的結(jié)果對(duì)原事件序列進(jìn)行變換,flatMap就是最好的選擇。
enum E : Error {
case demoAError
case demoBError
}
struct Player {
var score: BehaviorRelay<Int>
}
flatMap :1、把序列中的事件變成新的Observable 2、合并所有轉(zhuǎn)換過(guò)的序列
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)
執(zhí)行過(guò)程
----------John-----------------------Jole------------------------------------
flatMap{ $0.score.asObservable() }
-----------70------------75---------------------------85---------------------
--------------------------------------90-------------------------------------
-----------70------------75-----------90--------------85----------------------
note
flatMap 會(huì)把原序列中事件,轉(zhuǎn)變成observable。當(dāng)最早的 John 加入后, 把John 中的事件轉(zhuǎn)換成observable (介紹部分 1 ), 緊接著 Jole 加入, flatMap 同樣把他的事件也轉(zhuǎn)換成了 Observable, 并把兩個(gè) Observable<Int> 合并(介紹部分 2)。
John, 70 是初始化的值,75是第一個(gè) accept 的值,它屬于 John observable
Jole, 90 是初始化值嗎,它屬于 Jole observable
flatMap 合并了 John 和 Jole 兩個(gè)observable , 所以 John accpet 85 , 還是能接受到信號(hào)的。
flatMapLast:當(dāng)原序列有新的事件發(fā)生的時(shí)候,flatMapLast 會(huì)自動(dòng)取消上一個(gè)事件的訂閱,轉(zhuǎn)到新的事件的訂閱上面, flatMap則會(huì)訂閱全部。
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)
執(zhí)行過(guò)程
----------John-----------------------Jole------------------------------------
flatMapLatest{ $0.score.asObservable() }
-----------70------------75---------------------------85---------------------
--------------------------------------90-------------------------------------
-----------70------------75------------90--------------------------------------
note
- 70、 75 是屬于 John Observable<Int>, flatMapLast 當(dāng)前監(jiān)聽(tīng)的就是 John Observable<Int>
- 90、 是屬于 Jole Observable<Int>, flatMapLast 當(dāng)前監(jiān)聽(tīng)的就是 John Observable<Int> , 就會(huì)取消對(duì) John Observable<Int> 監(jiān)聽(tīng)