[英]Swift Combine Sink Array AnyPublisher
I would like to wait for data from all elements and combine them into one result:我想等待所有元素的数据并将它们组合成一个结果:
Item: AnyPublisher <Int, Swift.Error>
Array: AnyPublisher <[Result<Int, Swift.Error>], Never>
Can this be done somehow?这可以以某种方式完成吗? I've tried using Zip and Merge - but I couldn't get the desired result.
我已经尝试使用 Zip 和 Merge - 但我无法获得预期的结果。
Example:例子:
func createItem(num: Int) -> AnyPublisher<Int, Swift.Error> {
Just(num)
.setFailureType(to: Swift.Error.self)
.eraseToAnyPublisher()
}
func createItems(nums: [Int]) -> AnyPublisher<[Result<Int, Swift.Error>], Never> {
Publishers.MergeMany(nums.map { self.createItem(num: $0) } )
.collect()
.eraseToAnyPublisher()
}
Function but "createItems" does not work Function 但“createItems”不起作用
Looks like you want to generate an array of results - whether a value or an error - emitted by each publisher for each array value.看起来您想要生成一个结果数组 - 无论是值还是错误 - 由每个发布者为每个数组值发出。
MergeMany
+ Collect
is the right approach here. MergeMany
+ Collect
是正确的方法。 MergeMany
will complete only when all its input publishers complete, and .collect()
will for for that completion event before emitting. MergeMany
仅在其所有输入发布者完成时才会完成,并且.collect()
将在发出之前针对该完成事件。
Using your example:使用您的示例:
func createItems(nums: [Int]) -> AnyPublisher<[Result<Int, Error>], Never> {
let publishers = nums.map { v -> AnyPublisher<Result<Int, Error>, Never> in
createItem(num: v) // AnyPublisher<Int, Error>
.first() // ensure a single result
.map { .success($0) } // map value to .success result
.catch { Just(.failure($0)) } // map error to .failure result
.eraseToAnyPublisher()
}
return Publishers.MergeMany(publishers)
.collect() // wait for MergeMany to complete
.eraseToAnyPublisher()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.