我有一个联合发布商列表,每个发布商都发布一个可选值。从这个列表中,我想创建一个发布者,它按照上游发布者在列表中出现的顺序运行,一个接一个,然后发布我能找到的第一个非零项目。
我的第一个方法是
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)
这会创建一群具有不同延迟的发布商,这些发布商可能会产生也可能不会产生价值。然后,我收集所有结果,并选择第一个非零值。问题是
我做了我的研究,但没有发现类似的事情,也许是因为联合收割机并不是真正设计来做这类事情的。因此,任何指点都将受到赞赏。
该方法几乎与您原来的方法类似,但您需要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)
| 归档时间: |
|
| 查看次数: |
3055 次 |
| 最近记录: |