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&lt;[Int], Never&gt;AnyPublisher&lt;Int, Never&gt;?

我认为 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 数组转换为FooObservable(这是from进来)。

.flatMap  $0.publisher 

【讨论】:

这是正确的答案,但如果提供示例代码会更好。 我基于对 Rx API 的了解和对 Github 上项目的粗略概述(源代码)得出它......我自己不是 Swift 程序员;)

以上是关于Swift Combine:如何将 `AnyPublisher<[Foo], *>` 转换为 `AnyPublisher<Foo, *>`?的主要内容,如果未能解决你的问题,请参考以下文章

Swift Combine:如何从发布者列表中创建单个发布者?

如何使用 Combine + Swift 复制 PromiseKit 风格的链式异步流

Swift/Combine - 将过滤后的对象分配给类的属性

如何在 Swift 中使用 Combine 读取 JSON 错误对象的属性值?

Swift - JSONDecoder & Combine 框架问题

Combine如何驯服Future发布器的“怪癖”