【问题标题】:Swift Combine: How can I convert `AnyPublisher<[Foo], *>` to `AnyPublisher<Foo, *>`?Swift Combine:如何将 `AnyPublisher<[Foo], *>` 转换为 `AnyPublisher<Foo, *>`?
【发布时间】:2019-10-13 14:20:30
【问题描述】:

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

例如如何转换

AnyPublisher&lt;[Int], Never&gt; 到 AnyPublisher&lt;Int, Never&gt;?

我认为 RxSwift 提供的 from operator 可能与我想做的类似。

我想我想要组合 collect 的逆?

【问题讨论】:

    标签: swift rx-swift combine


    【解决方案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 程序员;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    相关资源
    最近更新 更多