Swift 组合:依次运行发布者列表,并发布第一个非零元素

Fal*_*ler 3 ios swift combine

我有一个联合发布商列表,每个发布商都发布一个可选值。从这个列表中,我想创建一个发布者,它按照上游发布者在列表中出现的顺序运行,一个接一个,然后发布我能找到的第一个非零项目。

我的第一个方法是

publishers
    .publisher
    .flatMap(identity)
    .first(where: {$0 != nil})
Run Code Online (Sandbox Code Playgroud)

但这会导致所有发布商都跑,并且最快的获胜。

我创建了一个最小的示例,其解决方案接近我想要实现的目标。

publishers
    .publisher
    .flatMap(identity)
    .first(where: {$0 != nil})
Run Code Online (Sandbox Code Playgroud)

这会创建一群具有不同延迟的发布商,这些发布商可能会产生也可能不会产生价值。然后,我收集所有结果,并选择第一个非零值。问题是

  • 所有效果均已运行。我只想运行效果,直到运行一个产生值的效果为止。
  • 结果按照发布者完成的顺序到达。之后我需要恢复原始顺序,这是可能的,但在我的具体示例中很尴尬。

我做了我的研究,但没有发现类似的事情,也许是因为联合收割机并不是真正设计来做这类事情的。因此,任何指点都将受到赞赏。

New*_*Dev 6

该方法几乎与您原来的方法类似,但您需要flatMap使用参数限制一次最多运行一个发布者maxPublishers

publishers
    .publisher
    .flatMap(maxPublishers: .max(1), { $0 })
    .compactMap { $0 } // Remove all nil values and unwrap the non-nil ones.
    .first()
Run Code Online (Sandbox Code Playgroud)