Swift Combine中如何将两个Future<[Int]>合并为连续一维数组
合并两个
Future<[Int]>生成一维数组的实现方案 之前用append、merge得到二维数组是操作符的固有语义导致的:这类操作符会把每个Future输出的[Int]作为独立事件单元传递,两个数组合并后自然形成嵌套的[[Int]]结构,和“把两个数组的内部元素拼接为连续一维数组”的目标不匹配。
更优的实现方式
1. 并行等待双Future完成后整体拼接(最通用场景)
用zip操作符并行触发两个Future,在双值回调中直接合并内部数组,全程不会产生二维中间结构:
let result = Observable.zip(left, right) { $0 + $1 }
- 从类型源头就是
[Int],不需要额外的降维处理 - 触发逻辑和你原有的collect方案一致:两个Future全部成功返回后才执行合并,没有额外的串行等待耗时
- 逻辑直白,不需要嵌套多层闭包做结构变换
2. 逐元素透传场景
如果不需要等两个Future全部完成,希望哪个Future先返回就立刻将其内部元素逐个投递,可以用merge搭配flatMap拆分单个数组:
let elementStream = Observable.merge(left, right).flatMap { Observable.from($0) }
- 全程不会生成二维数组:每个
[Int]类型的事件都会被拆成单个Int的序列流,合并后直接输出连续元素 - 如果需要最终拿到全量一维数组,在流末尾追加
.toArray()即可,完全替代你之前嵌套两层flatMap做降维的逻辑
现有实现的冗余点
你当前用的.collect().flatMap { arrays in arrays.flatMap { $0 } }存在无意义的结构嵌套:collect会先把两个数组打包为[[Int]]的二维结构,再通过额外的闭包逻辑手动拆回一维,相比上面的方案多了一次多余的结构拷贝,代码可读性也更差。
内容的提问来源于stack exchange,提问作者Logan
相关产品推荐
相关产品推荐

