Ios 合并框架第三个“collect”方法

Ios 合并框架第三个“collect”方法,ios,ios13,combine,Ios,Ios13,Combine,在iOS 13 Combine框架中,有三种collect操作符方法。前两个很明显,但第三个使用的类型我不清楚 collect(_:options:) func collect(u策略:publisher.TimeGroupingStrategy, 选项:S.SchedulerOptions?=nil) ->出版商。收藏时间 其中S:调度程序 有人能举一个例子说明如何调用这个方法吗?经过一番努力,我想出了这样一个例子: let t = Timer.publish(every: 0.4,

在iOS 13 Combine框架中,有三种
collect
操作符方法。前两个很明显,但第三个使用的类型我不清楚

 collect(_:options:)

func collect(u策略:publisher.TimeGroupingStrategy,
选项:S.SchedulerOptions?=nil)
->出版商。收藏时间
其中S:调度程序

有人能举一个例子说明如何调用这个方法吗?

经过一番努力,我想出了这样一个例子:

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() }
(其中,
存储
是通常的
设置
以使订户保持活动状态)

输出为:

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

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

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

  • byTime
  • byTimeOrCount
在任何一种情况下,前两个参数都是运行它们的调度程序(Immediate、DispatchQueue、Runloop或OperationQueue),这通常是通过传入的任何参数推断出来的。与调度程序一起出现的是一个跨步(您指定的时间间隔),操作员将在该跨步上缓冲值

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

指定这些的两种方法是:

let q=DispatchQueue(标签:self.debugDescription)
出版商
.collect(.byTime(q,1.0))

let q=DispatchQueue(标签:self.debugDescription)
出版商
.collect(.byTimeOrCount(q,1.0,10))
它们使用DispatchQueue,但您也可以轻松地使用任何其他调度器。 如果你只是在跨步中通过一个双人,它会以秒为单位将其作为一个值

在这两种情况下,当时间(或计数,如果指定了该版本)结束时,操作员将依次向其订阅者发布一个收集值的数组

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