RxSwift序列轉換
map
將序列每個元素轉換一遍,適合於序列內的元素類型改變,比如Bool轉換爲String, 或者其他值的操作。
輸入類型, 輸出還是類型
flapMap
將序列的元素轉換爲其他序列, 就很適合a序列轉換爲b序列,比如
輸入類型/序列, 輸出序列
flapMapLatest
和flapMap相似,不同的是隻發出最新元素
Error 序列中斷
一旦序列產生一個error,整個序列將被終止,後續監聽也就監聽不了,也包括序列轉換
Error Handling 錯誤事件處理
實例代碼:
private func createObservable() {
let subject = PublishSubject<Void>()
/// 使用flatMap轉換爲其他序列
let otherOb = subject.asObservable()
.flatMapLatest({_ -> Observable<String> in
print("flatMap")
return self.netRequest()
})
// 發出一次next, 由於沒有訂閱,所以沒有效
subject.onNext(())
// 訂閱
subject.subscribe(onNext: { (_) in
print("發出一次事件")})
.disposed(by: disposeBag)
// 又發出一次事件
subject.onNext(())
// 訂閱otherOb, 之後發出的事件都可以監聽,除非序列發出Error事件
otherOb.subscribe(onNext: { (value) in
print("otherSub subscribe")
print(value)})
.disposed(by: disposeBag)
// subject 發出兩次事件
subject.onNext(()) // [1]如果在netRequet方法中拋出Error, 就會引起序列終止,下面一個發出事件也就無效。
subject.onNext(())
}
// 模擬網絡請求
private func netRequest() -> Observable<String> {
return Observable<String>.create { (observer) -> Disposable in
observer.onError(NSError(domain: "www.baidu.com", code: 30, userInfo: [:]))
// observer.onNext("你好")
// observer.onCompleted()
return Disposables.create()
}
}
運行日誌打印
發出一次事件
發出一次事件
flatMap
Unhandled error happened: Error Domain=www.baidu.com Code=30 "(null)"
subscription called from:
發出一次事件
發出一次事件
可以看到,如果網絡請求拋出error [1]之後的下一次next將不會轉換,同理轉換出來的序列也會中斷。
如果不發出Error只發出next和complete
// 模擬網絡請求
private func netRequest() -> Observable<String> {
return Observable<String>.create { (observer) -> Disposable in
observer.onNext("你好")
observer.onCompleted()
return Disposables.create()
}
}
打印輸出
發出一次事件
發出一次事件
flatMap
otherSub subscribe
你好
發出一次事件
flatMap
otherSub subscribe
你好
可以看到,序列沒有中斷,對應的轉換也沒有中斷。
總之
不要輕易發出Error事件,考慮到會不會終止序列和轉換。如果需要錯誤提示,採用Result也許更好。