RxSwift转换Observable出现Observable<Observable<T>>嵌套报错解决
错误原因
map操作符的核心作用是对Observable发射的元素值做同步转换,不会改变序列的嵌套层级:如果闭包返回值类型是T,经过map处理后得到的序列类型就是Observable<T>。
你的代码中在map闭包内返回了Observable<TransferSubmitResult>类型的值,最终生成的序列是嵌套的Observable<Observable<TransferSubmitResult>>,和observeResultForShowUI方法要求的入参类型Observable<TransferSubmitResult>不匹配,因此触发编译错误。
修复方案
根据转换逻辑的场景选择对应写法即可:
- 同步转换(适配当前需求):你当前实现的是两个模型的字段映射,属于纯同步逻辑,不需要在转换闭包里包装Observable,直接返回转换后的
TransferSubmitResult实例即可:
let observableResult = transferService.createOrder(request: request).map { acquirebatchOrderResult -> TransferSubmitResult in let transferSubmitResult = TransferSubmitResult() // 完成acquirebatchOrderResult到transferSubmitResult的字段赋值、数据转换逻辑 return transferSubmitResult } // 此时observableResult类型为Observable<TransferSubmitResult>,可直接传入方法 observeResultForShowUI(result: observableResult)
- 异步转换场景:如果后续转换逻辑涉及异步操作(比如需要串行额外网络请求、异步读取本地数据等),必须在闭包中返回Observable的话,将
map替换为flatMap即可。flatMap会自动将闭包返回的内层Observable打平,最终输出单层的目标类型序列:
let observableResult = transferService.createOrder(request: request).flatMap { acquirebatchOrderResult -> Observable<TransferSubmitResult> in let transferSubmitResult = TransferSubmitResult() // 包含异步逻辑的转换处理 return Observable.just(transferSubmitResult) }
提示:纯同步转换优先使用第一种写法,代码更简洁,也不会产生不必要的序列包装开销。
内容的提问来源于stack exchange,提问作者XenixDANA
相关产品推荐
相关产品推荐

