【问题标题】:Combine framework third `collect` method结合框架第三个`collect`方法
【发布时间】:2019-12-13 22:33:06
【问题描述】:

在 iOS 13 Combine 框架中,共有三个 collect 运算符方法。前两个很明显,但第三个使用我无法弄清楚的类型。

 collect(_:options:)

https://developer.apple.com/documentation/foundation/timer/timerpublisher/3329497-collect

func collect<S>(_ strategy: Publishers.TimeGroupingStrategy<S>, 
    options: S.SchedulerOptions? = nil) 
    -> Publishers.CollectByTime<Timer.TimerPublisher, S> 
    where S : Scheduler

谁能举例说明如何调用此方法?

【问题讨论】:

    标签: ios ios13 combine


    【解决方案1】:

    经过一番挣扎,我想出了一个这样的例子:

    let t = Timer.publish(every: 0.4, on: .main, in: .default)
    t
        .scan(0) {prev,_ in prev+1}
        .collect(.byTime(DispatchQueue.main, .seconds(1))) // *
        .sink(receiveCompletion: {print($0)}) {print($0)}.store(in:&storage)
    let cancellable = t.connect()
    delay(3) { cancellable.cancel() }
    

    (其中storage 是通常的Set&lt;AnyCancellable&gt; 以保持订阅者存活)。

    输出是:

    [1, 2]
    [3, 4, 5]
    [6, 7]
    

    所以我们大约每 0.4 秒发布一个新数字,但 collect 仅每 1 秒执行一次。因此,前两个值到达,发布12,然后collect 完成它的工作,累积到目前为止到达的所有值,并将它们作为数组发布,[1,2]。等等。每一秒,到目前为止管道中的任何内容都会累积到一个数组中并作为一个数组发布。

    【讨论】:

      【解决方案2】:

      两个 TimeGroupingStrategy 机制在该枚举中发布。在 iOS 13.3 中仍然只有两个:

      • byTime
      • byTimeOrCount

      在任何一种情况下,前两个参数都是在其上运行它们的调度程序(Immediate、DispatchQueue、Runloop 或 OperationQueue),这通常只是通过您传入的任何内容来推断。与调度程序一起使用的是 Stride - a您指定的时间间隔 - 操作员将缓冲值。

      byTime 中,它将在您指定的时间间隔内收集和缓冲它接收到的尽可能多的元素(使用无限量的内存来这样做)。 byTimeOrCount 会将缓冲的项目数量限制为特定计数。

      指定这些的两种方法是:

      let q = DispatchQueue(label: self.debugDescription)
      publisher
          .collect(.byTime(q, 1.0))
      

      let q = DispatchQueue(label: self.debugDescription)
      publisher
          .collect(.byTimeOrCount(q, 1.0, 10))
      
      

      这些使用 DispatchQueue,但您也可以轻松使用任何其他调度程序。 如果你只是传入一个 Double 作为步幅,它会将它作为一个以秒为单位的值。

      在这两种情况下,当时间(或计数,如果指定了该版本)过去时,运营商将依次向其订阅者发布收集到的值的数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-20
        • 2014-06-21
        • 1970-01-01
        • 2014-04-23
        • 1970-01-01
        • 2011-06-05
        • 1970-01-01
        相关资源
        最近更新 更多