首先我创建一个像这样的串行队列
static dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);
然后,在某个未知的时间点,任务被添加到队列中,如下所示
dispatch_async(queue, ^{
// do something, which takes some time
});
如果第一个任务尚未完成,新任务将等待第一个任务完成(这当然就是串行队列的用途)。
但是,如果我向队列中添加 5 个新任务,而原来的第一个任务仍在运行,我不想执行新任务 1 号,然后是 2 号,然后是 3 号,依此类推,而是想得到原来的第一个任务完成后,去掉任务1到4,直接开始执行任务5。
换句话说,如果我添加一个新任务,我想将任何等待任务(不是当前正在运行的任务)从队列中弹出。
是否有内置机制,或者我必须自己实现?对于后者,我如何识别队列中的单个任务并删除它们?
一旦一个块被提交到 GCD 调度队列,它将运行。没有办法取消它。如您所知,您可以实现自己的机制来提前“中止”块执行。
一个更简单的方法是使用NSOperationQueue
,因为它已经提供了取消挂起操作(即那些尚未运行的操作)的实现,并且您可以轻松地将新的块放入队列addOperationWithBlock
method.
Though NSOperationQueue
是使用GCD实现的,我发现GCD在大多数情况下更容易使用。但是,在这种情况下,我会认真考虑使用NSOperationQueue
因为它已经处理取消挂起的操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)