Swift联合收割机接收器阵列
我想等待来自所有元素的数据,并将它们组合成一个结果:Swift联合收割机接收器阵列,swift,combine,Swift,Combine,我想等待来自所有元素的数据,并将它们组合成一个结果: Item: AnyPublisher <Int, Swift.Error> Array: AnyPublisher <[Result<Int, Swift.Error>], Never> 项:AnyPublisher 数组:AnyPublisher 这能做到吗?我尝试过使用Zip和Merge,但没有达到预期的效果 例如: func createItem(num: Int) -> AnyPublis
Item: AnyPublisher <Int, Swift.Error>
Array: AnyPublisher <[Result<Int, Swift.Error>], Never>
项:AnyPublisher
数组:AnyPublisher
这能做到吗?我尝试过使用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: $0) } )
.collect()
.eraseToAnyPublisher()
}
func-createItem(num:Int)->AnyPublisher{
刚好(num)
.setFailureType(收件人:Swift.Error.self)
.删除任何发布者()
}
func createItems(nums:[Int])->AnyPublisher{
publisher.MergeMany(nums.map{self.createItem(num:$0)})
.collect()
.删除任何发布者()
}
函数,但“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($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()
}
func-createItems(nums:[Int])->AnyPublisher{
让publisher=nums.map{v->AnyPublisher进入
createItem(num:v)//AnyPublisher
.first()//确保一个结果
.map{.success($0)}//将值映射到.success结果
.catch{Just(.failure($0))}//将错误映射到.failure结果
.删除任何发布者()
}
返回发布者。合并多个(发布者)
.collect()//等待MergeMany完成
.删除任何发布者()
}
收款后可能还有其他事情要做?我添加了一个示例。@БББППППииаааааааа,那么,您希望每个发布者提供一个结果数组,无论是值还是错误?如果每个发布者都发出多个值,会发生什么情况?我计划从每个发布者那里获得一个值,然后取消订阅。入口处将有发布者发送一次结果(向服务器发出请求)。@öСППППСааааааааааа