You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:35:27