取消正在等待执行的dispatch_async队列

时间:2016-09-19 16:59:35

标签: ios objective-c multithreading queue

首先,我知道已经有很多问题需要取消dispatch_async,我知道有人说停止运行队列。 但是没有任何关于队列中等待块的帖子。

假设我实现了类似的东西。

@property(nonatomic)dispatch_queue_t My_queue = dispatch_queue_create("something", NULL)

dispatch_async(self.My_queue, ^(void){
   // LONG TASK ONE
});

dispatch_async(self.My_queue, ^(void){
   // LONG TASK TWO
});

dispatch_async(self.My_queue, ^(void){
   // LONG TASK THREE
});

在新线程中将有三个块的队列,一个将运行,两个将等待。如何取消那两个等待的人?

1 个答案:

答案 0 :(得分:1)

您正在寻找的是dispatch_suspend()

  

通过挂起调度对象,您的应用程序可以暂时阻止执行与该对象关联的任何块。在完成呼叫时运行的任何阻止后,将发生暂停。

dispatch_suspend(self.My_queue);

这意味着队列将执行挂起块(第一个),并且不会执行下一个块。一旦你摆脱了对队列的引用,它的保留计数就会减少,一旦它变为零,队列就会被破坏,同时还有被调度的块(除非在代码的其他部分引用了块)。

作为旁注,关于编码样式,属性名称应以小写字母开头,建议遵循camelCase约定:myQueue而不是My_queue