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
- 它与每个新的上游值一起发出并将它与其他上游的最新消息。
这是我需要实现的伪代码:
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
- 它与每个新的上游值一起发出并将它与其他上游的最新消息。