Swift 合并接收器阵列 AnyPublisher
Swift Combine Sink Array AnyPublisher
我想等待来自所有元素的数据并将它们合并为一个结果:
Item: AnyPublisher <Int, Swift.Error>
Array: AnyPublisher <[Result<Int, Swift.Error>], Never>
这能以某种方式完成吗?我试过使用 Zip 和 Merge - 但我得不到想要的结果。
示例:
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: [=12=]) } )
.collect()
.eraseToAnyPublisher()
}
功能正常,但“createItems”不起作用
您似乎想要生成一个结果数组 - 无论是值还是错误 - 由每个发布者为每个数组值发出。
MergeMany
+ Collect
是这里的正确方法。 MergeMany
将仅在其所有输入发布者完成时完成,并且 .collect()
将在发出之前完成该完成事件。
使用你的例子:
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([=10=]) } // map value to .success result
.catch { Just(.failure([=10=])) } // map error to .failure result
.eraseToAnyPublisher()
}
return Publishers.MergeMany(publishers)
.collect() // wait for MergeMany to complete
.eraseToAnyPublisher()
}
我想等待来自所有元素的数据并将它们合并为一个结果:
Item: AnyPublisher <Int, Swift.Error>
Array: AnyPublisher <[Result<Int, Swift.Error>], Never>
这能以某种方式完成吗?我试过使用 Zip 和 Merge - 但我得不到想要的结果。
示例:
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: [=12=]) } )
.collect()
.eraseToAnyPublisher()
}
功能正常,但“createItems”不起作用
您似乎想要生成一个结果数组 - 无论是值还是错误 - 由每个发布者为每个数组值发出。
MergeMany
+ Collect
是这里的正确方法。 MergeMany
将仅在其所有输入发布者完成时完成,并且 .collect()
将在发出之前完成该完成事件。
使用你的例子:
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([=10=]) } // map value to .success result
.catch { Just(.failure([=10=])) } // map error to .failure result
.eraseToAnyPublisher()
}
return Publishers.MergeMany(publishers)
.collect() // wait for MergeMany to complete
.eraseToAnyPublisher()
}