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完成
.删除任何发布者()
}

收款后可能还有其他事情要做?我添加了一个示例。@БББППППииаааааааа,那么,您希望每个发布者提供一个结果数组,无论是值还是错误?如果每个发布者都发出多个值,会发生什么情况?我计划从每个发布者那里获得一个值,然后取消订阅。入口处将有发布者发送一次结果(向服务器发出请求)。@öСППППСааааааааааа