Combine框架中是否存在与collect反向的uncollect数组元素拆分发射操作符?
Combine 原生支持实现你要的「单元素拆分为多元素逐个发射」的需求,不需要自定义笨重的JustSeveral Publisher。
你之前对 Combine 的flatMap存在误解,它不仅可以处理异步 Publisher,也支持返回同步的序列 Publisher,配合原生的Publishers.Sequence(专门用于将 Swift 序列转换为按顺序发射序列元素的 Publisher),就能直接实现你要的uncollect能力。
原生实现代码
extension Publisher { func uncollect<T>(_ transform: @escaping (Output) -> [T]) -> AnyPublisher<T, Failure> { self .flatMap { output in Publishers.Sequence(sequence: transform(output)) .setFailureType(to: Failure.self) } .eraseToAnyPublisher() } }
实现说明
这个版本完全符合你的需求:
- 上游每发射一个集合,就会按顺序逐个发射集合内的所有元素,比如上游发射
[1,2,3],下游就会依次收到1、2、3 - 完全不改变流的完成状态:上游的正常完成事件、错误事件都会原样透传给下游,不会做额外的等待或修改
- 全部使用 Combine 原生组件实现,没有额外依赖,性能和系统兼容性更好
你之前的示例代码可以直接替换掉自定义的JustSeveral版本,运行效果完全一致。如果不想单独封装uncollect操作符,也可以直接在调用链里写对应的逻辑:
serverEventStream .flatMap { Publishers.Sequence(sequence: $0).setFailureType(to: Never.self) } .flatMap { fibonacci($0) } .sink { print($0) }
内容的提问来源于stack exchange,提问作者Senseful
相关产品推荐
相关产品推荐

