2013-05-08 28 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

相關問題