2013-05-08 55 views
2

如果我有一个dispatch_group类属性:dispatch_group_notify块是否对dispatch_group_t的生命周期持续存在?

@property (nonatomic, readonly) dispatch_group_t _serialGroup; 

,我有一个块,我总是希望每当组完成名为:

dispatch_group_notify(self._serialGroup, self._serialQueue, ^{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     //...do some stuff... 
    }); 
}); 

可我只是在的动初始化定义dispatch_group_notifydispatch_group曾经一次,每当该组完成时它会被调用,或者每次向组添加项目时是否需要重新定义它?

回答

4

A dispatch_group_notify()在API被调用后(或立即如果组已空),第一次该组变为空时,块被提交一次到指定队列。

如果您想要再次调用通知块,则必须重新安装它(例如,作为通知块本身的一部分,但请注意,如果在重新安装时组仍然为空,它将立即重新提交它)。

+0

Dang,这里的用例是我想在队列为空时调用一个'block()',但是我不断向队列中添加项目,所以我如何确保将'block()'添加到w /多次添加它? – Shizam 2013-05-11 22:24:34

+0

我想不出一种简单而廉价的方式来使用当前的组API(但它将是一个值得提升的文件请求...)。你最简单的高效选项可能是用你自己的'dispatch_async()'包装器来调用'dispatch_group_async()',它通过'OSAtomicIncrement()'/'OSAtomicDecrement()'维护一个原子计数器并触发'dispatch_async()你的通知块在1-> 0转换(即当递减返回0时)。 – das 2013-05-11 23:04:15

0

你必须通过调用dispatch_release()来释放它。所以你可以坚持下去并重新使用它

+0

我必须在我的'dispatch_group'上调用'dispatch_release'是的,但是问题是我可以在创建时定义一个通知块,还是通知块在完成时调用并释放。这样在组创建后立即定义块就没有任何作用。 – Shizam 2013-05-08 19:28:47