【问题标题】:Just with several values?只有几个值?
【发布时间】:2021-05-13 17:21:05
【问题描述】:

我想要一个类似于Just 的发布者,除了它应该发出多个值,然后完成流。

我们就叫它JustSeveral

func fibonacci(_ number: Int) -> AnyPublisher<Int, Never> {
  Future { ... }.eraseToAnyPublisher()
}

JustSeveral([293, 18, 104])
  .flatMap { fibonacci($0) }
  .sink { print($0) }

有没有办法将运算符与Just 结合起来获得相同的东西,还是我需要自己构建这个Publisher?

注意:任何解决方案都应该能够处理数组中任意数量的元素,而不仅仅是 3 个。


例如,如果我们有一个uncollect operator,这将是微不足道的:

Just([293, 18, 104])
  .uncollect { $0 }
  .flatMap { fibonacci($0) }
  .sink { print($0) }

【问题讨论】:

    标签: ios swift combine


    【解决方案1】:

    导入 Combine 扩展 Array 并使用名为 publisher 的计算属性,该属性返回 Sequence&lt;Array&lt;Int&gt;, Never&gt;,即 Publisher。所以你可以这样做:

    [293, 18, 104]
        .publisher
        .flatMap { fibonacci($0) }
        .sink { print($0) }
    

    但是,Apple 的 API 文档很混乱,而且我认为没有一个页面可以记录 Array.publisher

    【讨论】:

    【解决方案2】:

    更新:您应该使用built-in .publisher method


    原答案

    一个解决方案是make the publisher wait until there is a subscription and then emit values:

    public struct JustSeveral<Value>: Publisher {
      public init(_ outputs: [Value]) {
        self.outputs = outputs
      }
    
      public var outputs: [Value]
    
      public typealias Output = Value
      public typealias Failure = Never
    
      public func receive<Downstream: Subscriber>(subscriber: Downstream) where Downstream.Input == Output, Downstream.Failure == Failure {
        let subject = PassthroughSubject<Value, Never>()
        subject
          .subscribe(subscriber)
    
        outputs.forEach { subject.send($0) }
        subject.send(completion: .finished)
      }
    }
    

    虽然这可行,但我不知道它是否是最佳解决方案,因为它只在订阅时发出值。我不确定Just 是这样工作的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 2017-11-19
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多