【问题标题】:Swift Combine Sink Array AnyPublisherSwift 合并接收器数组 AnyPublisher
【发布时间】:2021-02-22 17:15:56
【问题描述】:

我想等待所有元素的数据并将它们组合成一个结果:

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: $0) } )
        .collect()
        .eraseToAnyPublisher()
}

功能但“createItems”不起作用

【问题讨论】:

标签: swift combine


【解决方案1】:

您似乎想要生成一个结果数组 - 无论是值还是错误 - 由每个发布者为每个数组值发出。

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()
}

【讨论】:

  • 也许收集后还有其他事情要做?我添加了一个例子。
  • @ОлегПривалов,所以,您想要来自每个发布者的一系列结果 - 无论是价值还是错误?如果每个发布者发出多个值会怎样?
  • 我计划从每个发布者那里获取一个值并取消订阅
  • 入口会有发布者发送一次结果(向服务器请求)。
  • 非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多