如何用Swift Combine组合两个请求生成CustomData实例?
用Swift Combine链式组合两个Publisher创建CustomData对象
当然可以,借助Combine的zip操作符就能实现这个需求——它会等待两个Publisher都完成输出,再把结果组合起来生成CustomData实例。
完整实现代码
首先是你给出的结构体和基础方法:
struct CustomData { let data1: Int let data2: String } func getInt() -> AnyPublisher<Int, Error> { return Just(Int.random(in: 0...100)) .setFailureType(to: Error.self) .eraseToAnyPublisher() } func getString() -> AnyPublisher<String, Error> { return Just("\(Int.random(in: 200...400))") .setFailureType(to: Error.self) .eraseToAnyPublisher() }
接下来是组合两个Publisher并生成CustomData的链式调用实现:
func getCustomData() -> AnyPublisher<CustomData, Error> { getInt() .zip(getString()) // 等待两个Publisher都发出值后,组合成(Int, String)元组 .map { intVal, strVal in CustomData(data1: intVal, data2: strVal) // 用组合结果创建CustomData } .eraseToAnyPublisher() // 擦除类型,对外暴露统一的Publisher类型 }
如何订阅结果
你可以像这样订阅getCustomData()的输出:
// 保存订阅对象,防止被提前释放 var cancellable: AnyCancellable? cancellable = getCustomData() .sink( receiveCompletion: { completion in switch completion { case .finished: print("流已完成") case .failure(let err): print("出错:\(err.localizedDescription)") } }, receiveValue: { data in print("生成的CustomData:data1=\(data.data1),data2=\(data.data2)") } )
关键逻辑说明
zip操作符的特性:必须等两个上游Publisher都发出至少一个值,才会向下游传递组合后的元组;如果任意一个Publisher发出错误,整个流会立刻终止并传递该错误。- 如果你的场景不需要严格等待两个结果同时到达,而是只要其中一个更新就生成新的
CustomData,可以用combineLatest替代zip,它会在任意一个上游Publisher发出新值时,用最新的两个值生成组合结果。
内容的提问来源于stack exchange,提问作者Maysam
相关产品推荐
相关产品推荐

