【RxSwift】flatMapLatest、 Error事件中断序列
RxSwift序列转换
map
将序列每个元素转换一遍,适合于序列内的元素类型改变,比如Bool转换为String, 或者其他值的操作。
输入类型, 输出还是类型
flapMap
将序列的元素转换为其他序列, 就很适合a序列转换为b序列,比如
输入类型/序列, 输出序列
flapMapLatest
Error 序列中断
一旦序列产生一个error,整个序列将被终止,后续监听也就监听不了,也包括序列转换
Error Handling 错误事件处理
实例代码:
private func createObservable() {let subject = PublishSubject<Void>()/// 使用flatMap转换为其他序列let otherOb = subject.asObservable().flatMapLatest({_ -> Observable<String> inprint("flatMap")return self.netRequest()})// 发出一次next, 由于没有订阅,所以没有效subject.onNext(())// 订阅subject.subscribe(onNext: { (_) inprint("发出一次事件")}).disposed(by: disposeBag)// 又发出一次事件subject.onNext(())// 订阅otherOb, 之后发出的事件都可以监听,除非序列发出Error事件otherOb.subscribe(onNext: { (value) inprint("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 inobserver.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 inobserver.onNext("你好")observer.onCompleted()return Disposables.create()}}
打印输出
发出一次事件
发出一次事件
flatMap
otherSub subscribe
你好
发出一次事件
flatMap
otherSub subscribe
你好
可以看到,序列没有中断,对应的转换也没有中断。
总之
不要轻易发出Error事件,考虑到会不会终止序列和转换。如果需要错误提示,采用Result也许更好。
【RxSwift】flatMapLatest、 Error事件中断序列相关推荐
- RxSwift处理Error事件
如何处理RxSwift的Error事件 翻译自:How to handle errors in RxSwift 在最近这些日子里,MVVM在iOS开发中变得越来约受欢迎,RxSwfit也变得越来越流行 ...
- 【等待事件】序列等待事件总结(enq: SQ - contention、row cache lock、DFS lock handle和enq: SV - contention)...
[等待事件]序列等待事件总结(enq: SQ - contention.row cache lock.DFS lock handle和enq: SV - contention) [等待事件]序列等待事 ...
- TMS320C645x DSP SRIO寄存器(五)——LSU和其他特殊事件中断
本文是对TI的TMS320C645x DSP SRIO User's Guide中5.21-5.24.5.28-5.31节内容的搬运 与第4章大部分内容相关 一.LSU中断 LSU中断状态寄存器(LS ...
- vue项目中 img标签加载失败(404)方法,@error事件
vue项目中 img标签加载失败方法,@error事件 @error="defImg" <img src="123" @error="defIm ...
- RxSwift之深入解析特殊序列deallocating与deallocated的源码实现
一.引言 在 RxSwfit 中,有两个特殊序列:deallocating 与 deallocated,deinit 等价于 dealloc.在 deallocating 与 deallocated ...
- STM32之中断与事件---中断与事件的区别
这张图是一条外部中断线或外部事件线的示意图,图中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套.图中的蓝色虚线箭头,标出了外部中断信号的传输路径,首先外部信号从编号1的芯片管脚 ...
- Python实现《明日方舟》干员寻访模拟器第二期:间接学习变化序列抽取目标事件和序列精确索引内容的经验
上一期的文章我们实现了<明日方舟>干员寻访模拟器单次抽奖的功能,了解了random.choice这个函数的特点,通过原始奖池机制把等可能转化为不等可能,上一期我们还编写了一个便捷的不等可能 ...
- RxSwift 小记 Error Handling Operators(catchError,retry)
(*useful)标记:目前觉得有用的函数 //FIXME 标记:待补充 ##帮助捕获错误,并可以发送消息,平滑的处理error ####catchErrorJustReturn example(&q ...
- 【Android 事件分发】事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 )
Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) 文章目录 ...
最新文章
- CSMA/CD--CSMA/CA
- 【内核】linux内核启动流程详细分析
- 【递推】P1028 数的计算
- 修改after样式_理解:Before和:After伪元素
- CanalAdapter启动过程分析(源码详解)
- AndroidStudio常用快捷键及其设置
- Python自动化运维——IP地址处理模块
- P3978 [TJOI2015]概率论(生成函数)
- 在同一台机器上启动多个JBoss A-MQ JVM
- mysql 相关搜索_MySQL单词搜索相关度排名
- 暑期训练日志----2018.8.23
- 寻找电路布线最短路径算法BFS
- 【IOS捷径】获取时间戳
- java手写-txt大文本分割
- Web全栈~02.表单样式设计
- android地图旋转监听,ArcGIS for Android示例解析之地图旋转-----MapRotation
- TokenGazer《一问到底》| 第55期:研究员 VS Dimension
- Lowest, highest?
- 声学感知刻度(mel scale、Bark scale、ERB)与声学特征提取(MFCC、BFCC、GFCC)
- 四级恋练有词课程 (10课时-朱伟)1.Unit1A单词识记(上)