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 异步串行队列 - 可以限制队列大小?的主要内容,如果未能解决你的问题,请参考以下文章
同步,异步,串行队列,并发队列,全局队列,主队列等概念的总结