Swift Combine:如何将 `AnyPublisher<[Foo], *>` 转换为 `AnyPublisher<Foo, *>`?

3

如何将数组元素的发布者转换为只发布该元素(但具有更多事件)的发布者?

例如,如何将

AnyPublisher<[Int], Never> 转换为 AnyPublisher<Int, Never>

我认为 RxSwift 的 from 运算符 提供的功能类似于我的需求。

我想要 Combine collect 的反向操作,对吗?

2个回答

5

以下是代码:

func example(publisher: AnyPublisher<[Foo], Never>) -> AnyPublisher<Foo, Never> {
    return publisher
        .map { $0.publisher }
        .switchToLatest()
        .eraseToAnyPublisher()
}

.flatMap { $0.publisher }.map { $0.publisher }.switchToLatest() 有什么区别?也许后者在大多数情况下更适合?或者它们是完全等价的吗? - Sajjon
它们并不等价。如果下游订阅者限制了发布者,那么可能会出现问题。干得好。 - Daniel T.

2
你可能想要做的是,在 Foo 数组的发布者上使用 FlatMap,使用将 Foo 数组转换为 Observable 的函数(这就是 from 的作用所在)。
.flatMap { $0.publisher }

2
这是正确答案,但如果提供示例代码会更好。 - Daniel T.
我是基于了解 Rx API 和对 Github 项目(源代码)的粗略概述推导出来的,我本人并不是 Swift 程序员 ;) - user268396

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接