2012-03-03 59 views
10

我在后台使用dispatch_async运行一堆物品,有时候我想杀掉队列中的物品 - 这可能吗?例如,此代码在视图上运行,然后用户返回一个屏幕。无论后退导航如何,所有这些已启动的操作都会继续运行。理想情况下,我想从运行杀死这些项目:在iOS的dispatch_async队列中杀死物品

dispatch_async(dispatch_get_global_queue(2, 0), ^{ 
     for (int i=0; i<[self.manufacturers count]; i++) { 
      NSString *manufacturerID = [[[self.manufacturers objectAtIndex:i] ManufacturerID] stringValue]; 
      [self doSync:manufacturerID withIndex:i setTimer:YES]; 
     } 
    }); 

如果我创建一个队列,并将它命名,然后再释放这个被称为他们仍然继续运行视图的dealloc的。

回答

14

在调度队列中没有明确规定终止。为了做到这一点,测试逃生地点以确定终止是有点常见的。基本上,这将是一个信号量。

NSOperationQueue(更高层次的抽象,但仍然使用下面的GCD构建)确实支持取消操作。因此,例如,您可以创建一系列NSOperations,并将它们添加到NSOperationQueue,然后在不需要它完成时将消息-cancelAllOperations添加到队列中。

您选择的体系结构很多将取决于其中有多少个正在运行以及它们是否具有不同的触发器。在这些实现中,NSOperation可能是“最干净的”解决方案,因为您有一个任意队列,您可以观察操作完成,还可以取消未完成的操作。进一步降低黑客的规模将是一个易变的位置,每个这些块在紧密的循环内观看,以确定它们是否会过早完成。对于相同的基本功能,更进一步的下降将是一个全局变量。最后,甚至NSOperation的实现都涉及到一个测试,以便在一个一致的位置退出(因为只是杀死一个线程可能会导致数据在分配/再训练时不一致)。

2

执行此操作的最佳方法是创建您自己的并发队列(不使用全局队列之一),然后在队列中调用dispatch_suspend()以便在其中停止处理。在这一点上阅读:Dispatch queues: How to tell if they're running and how to stop them

使用取消标志将让你然后恢复队列,使所有剩余的块基本上只是退出(在做任何内存管理他们需要做的事情,如释放资源),当你恢复它再次。您也可以在恢复后立即将dispatch_release()队列。