Swift 将框架多个异步请求响应合并为一个

Swift Combine framework multiple async request responses into one

这是我需要实现的伪代码:

func apiRequest1() -> Future<ResultType1, Error> { ... }
func apiRequest2() -> Future<ResultType2, Error> { ... }
func transform(res1: ResultType1, res2: ResultType2) -> ResultType3 { ... }

func combinedApiRequests() -> Future<ResultType3, Error> {
    (resultType1, resultType2) = execute apiRequest1() and apiRequest2() asynchronously
    resultType3 = transform(resultType1, resultType2)
    return a Future publisher with resultType3
}

combinedApiRequests() 会怎样?

不需要return Future 发布者。 Future publisher是一个特定的publisher,但是对于下游而言,publisher是通过它的输出和失败类型来定义的。相反,return 一个 AnyPublisher<ResultType3, Error>.

Zip是一个发布者,它等待所有结果到达才发出一个值。这可能是您需要的(稍后会详细介绍)。这就是您的函数的外观:

func combinedApiRequests() -> AnyPublisher<ResultType3, Error> {
   Publishers.Zip(apiRequest1, apiRequest2)
             .map { transform(res1: [=10=], res2: ) }
             .eraseToAnyPublisher()
}

还有 CombineLatest 出版商。对于每个上游的第一个结果,它的行为与 Zip 相同,但对于后续结果则不同。在你的情况下,这并不重要,因为 Future 是一个 one-shot 发布者,但如果上游发布者发出多个值,那么你必须根据你的具体用例决定是否使用 Zip - 它总是等待 all upstreams 在它发出一个组合值之前发出一个值,或者 CombineLatest - 它与每个新的上游值一起发出并将它与其他上游的最新消息。