GCD 异步串行队列 - 可以限制队列大小?

Posted

技术标签:

【中文标题】GCD 异步串行队列 - 可以限制队列大小?【英文标题】:GCD Asynchronous, serial queue - possible to limit queue size? 【发布时间】:2016-06-22 16:44:30 【问题描述】:

我有一个长时间运行的任务,将在后台队列上串行运行。

一个特殊要求是我希望最大队列大小为 1,并且为 LIFO。

因此,如果在作业运行时有 N 个项目进入,我希望它们都被删除,除了最近的一个。类似于“去抖动”的工作原理。

【问题讨论】:

最大堆是否适合您的目的? 您可以在添加任何新blockOperation之前在您的operationQueue中取消AllOperations:[operationQueue cancelAllOperations]; [操作队列 addOperation:myblockOperation]; 【参考方案1】:

这类事情通常使用 GCD 中的DISPATCH_SOURCE_TYPE_DATA_OR 源来完成。这会将多个请求(通过 dispatch_source_merge_data() 触发)合并到源事件处理程序的单个调用中。

它被限制为 64 位“有效负载”,可通过 dispatch_source_get_data() 检索,(从传递给合并到此特定处理程序调用的 merge_data() 的所有值进行原子或运算)。

或者,DATA_ADD 源可用于简单地计算有多少请求被合并到单个处理程序调用中。

如果请求在事件处理程序已经被执行时进入,事件处理程序将在前一个调用完成后立即再次运行(以传递在前一个处理程序执行期间合并的所有请求)。

【讨论】:

以上是关于GCD 异步串行队列 - 可以限制队列大小?的主要内容,如果未能解决你的问题,请参考以下文章

在 GCD 中,串行队列通过异步操作 Swift 同步

ios多线程同步异步、串行并行队列、死锁

GCD 串行队列调度异步和同步

同步,异步,串行队列,并发队列,全局队列,主队列等概念的总结

IOS多线程知识总结/队列概念/GCD/串行/并行/同步/异步

iOS多线程知识总结/队列概念/GCD/串行/并行/同步/异步