【问题标题】:Cancel dispatch_async queue that is waiting for execution取消等待执行的 dispatch_async 队列
【发布时间】:2016-09-20 05:03:44
【问题描述】:

首先,我知道取消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
});

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

【问题讨论】:

标签: ios objective-c multithreading queue


【解决方案1】:

你要找的是dispatch_suspend():

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

dispatch_suspend(self.My_queue);

这意味着队列将执行待处理的块(第一个),并且不会执行下一个。一旦你摆脱了对队列的引用,它的保留计数就会减少,一旦它变为零,队列就会连同计划的块一起被销毁(除非在代码的其他部分引用了这些块)。

附带说明一下,关于编码样式,属性名称应以小写字母开头,并建议遵循驼峰式约定:myQueue 而不是 My_queue

【讨论】:

  • 谢谢您的回答。关于代码风格,我的队列名称并不是真正的 My_queue :D 所以我需要真正销毁队列以摆脱阻塞?因为我的情况是我有非常相似的调用,可以一一调用。但是因为它们相似,所以没有必要全部执行。所以我希望一个块删除所有其他等待执行的块。
  • @MarkoZadravec 队列将在不再有任何指向它的引用时自动销毁(感谢 ARC)。当队列存在时,其他块也将存在,但是它们不会被执行,因为队列现在已挂起。
  • 是的,你能不能再补充一下如何激活队列。
猜你喜欢
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多