Swift Combine:如何将 `AnyPublisher<[Foo], *>` 转换为 `AnyPublisher<Foo, *>`?
Posted
技术标签:
【中文标题】Swift Combine:如何将 `AnyPublisher<[Foo], *>` 转换为 `AnyPublisher<Foo, *>`?【英文标题】:Swift Combine: How can I convert `AnyPublisher<[Foo], *>` to `AnyPublisher<Foo, *>`? 【发布时间】:2019-10-13 14:20:30 【问题描述】:如何将某个元素的数组发布者转换为该元素的发布者(但有更多事件)?
例如如何转换
AnyPublisher<[Int], Never>
到 AnyPublisher<Int, Never>
?
我认为 RxSwift 提供的 from
operator 可能与我想做的类似。
我想我想要组合 collect
的逆?
【问题讨论】:
【参考方案1】:代码如下:
func example(publisher: AnyPublisher<[Foo], Never>) -> AnyPublisher<Foo, Never>
return publisher
.map $0.publisher
.switchToLatest()
.eraseToAnyPublisher()
【讨论】:
.flatMap $0.publisher
与 .map $0.publisher .switchToLatest()
相比如何?也许后者是大多数情况下想要的?还是它们完全等效?
它们不是等价的。如果下游订阅者限制发布者,那么可能会出现问题。不错的收获。【参考方案2】:
您可能想要做的是在Foo
数组的发布者上使用FlatMap
,使用一个函数将Foo
数组转换为Foo
的Observable
(这是from
进来)。
.flatMap $0.publisher
【讨论】:
这是正确的答案,但如果提供示例代码会更好。 我基于对 Rx API 的了解和对 Github 上项目的粗略概述(源代码)得出它......我自己不是 Swift 程序员;)以上是关于Swift Combine:如何将 `AnyPublisher<[Foo], *>` 转换为 `AnyPublisher<Foo, *>`?的主要内容,如果未能解决你的问题,请参考以下文章
Swift Combine:如何从发布者列表中创建单个发布者?
如何使用 Combine + Swift 复制 PromiseKit 风格的链式异步流
Swift/Combine - 将过滤后的对象分配给类的属性
如何在 Swift 中使用 Combine 读取 JSON 错误对象的属性值?