2012-03-13 47 views
4

我在下面的GCD中獲得主隊列,並在我的應用程序中添加來自不同類的不同任務。如何獲取GCD隊列中的任務列表?

dispatch_queue_t queue = dispatch_get_global_queue (
    DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

現在我想知道我的多少個任務仍在GCD主隊列中。

有沒有辦法讓GCD隊列中的任務列表?

謝謝

+0

GCD標籤保留爲「最大公約數」 - 更改標籤以糾正一個。 – paxdiablo 2012-03-13 03:02:27

回答

4

這實際上不是GCD的範例。例如,如果您想跟蹤特定的一組操作,則可以創建一個調度組並在完成後註冊以通知它,如本例中所示。

dispatch_group_t taskGroup = dispatch_group_create(); 
dispatch_queue_t queue = //Get whatever queue you want here 
dispatch_group_async(taskGroup, queue,^{ 
    [object doSomething]; 
}); 
dispatch_group_async(taskGroup, queue,^{ 
    [object doMoreStuff]; 
}); 
dispatch_group_async(taskGroup, queue,^{ 
    [object doEvenMoreStuff]; 
}); 
dispatch_group_notify(taskGroup, queue, ^{ 
    [object workDone]; 
}); 
dispatch_release(taskGroup); 
+0

很抱歉,我的應用程序無法應用發送組。由於多個類會將多個任務添加到GCD隊列中。調度組似乎只適用於一個類的單個實例。我的情況是,我想監視全球級中央池中多個班級的任務。 – user403015 2012-03-13 03:09:37

+0

不應該在dispatch_group_notify塊內使用dispatch_group_release,而不是在它下面使用dispatch_release? – droussel 2012-04-03 15:04:05

+1

該隊列將保留該組,因此在完成添加之後可以安全地釋放它(或者我犯了一個可怕的錯誤,並且應用程序不會運行^^;) – borrrden 2012-04-03 15:09:01

2

通常,這是通過調度組而不是隊列完成的。您可以使用dispatch_group_async()將任務分配給組,也可以使用dispatch_group_enter()dispatch_group_leave()手動標記組中的內容。然後,您可以使用dispatch_group_notify()dispatch_group_wait()檢查組中是否有任何內容。

+0

對不起,派遣組無法應用於我的應用程序由於多個類會將多個任務添加到GCD隊列中。調度組似乎只適用於一個類的單個實例。我的情況是,我想監視全球級中央池中多個班級的任務。 – user403015 2012-03-13 03:09:49

+2

組在發送時添加。它與課程無關。你使用'NSOperations'而不是直接調用'dispatch_'方法嗎?如果你使用'dispatch_'方法,那麼你可以在那個時候應用一個組。 – 2012-03-13 03:27:04

+0

我的情況:A類,B類和C類會在自己的實例中向GCD添加任務。我如何爲不同的類創建一個通用調度組?我可以將創建的組傳遞給不同的類嗎?謝謝。 – user403015 2012-03-13 03:33:36