2015-08-27 42 views
1

我的應用程序專門爲檢查進程的狀態而啓動線程。它激發每5-10秒:Cocoa OSX應用程序掛在dispatch_async

if(!monitorTask){ 
     MYLog(100,@"Monitor task is dead"); 
     return; 
} 
dispatch_async(monitorTask,^{ // fuckup here 
     MYLog(150,@"...Checking iTunes"); 

但它似乎也經常掛在那裏每個:

enter image description here

任何線索如何解決/趕上這?應用程序是beachballing但在Xcode中「跑」就好了 - 卡在該指令:

enter image description here

+1

什麼是'monitorTask'?請提供其初始化代碼。 'disp atch_async'函數調度執行塊。你需要傳遞'dispatch_queue_t'作爲第一個參數。 – Astoria

+0

是的,它的創建正確。它看起來像只在它通過Xcode運行時才掛起 – JeremyLaurenson

+0

請顯示'monitorTask' init代碼。 – Astoria

回答

0

你肯定monitorTask是dispatch_queue_t類型的? See these Apple guides for an example of how to create a serial queue

雖然我在您的評論中看到您正在創建隊列。

也可能在將隊列分派給隊列之前,可能會解除分配隊列。您可能需要在隊列上使用perform some memory management以確保在派發之前不會釋放它。

最後重要的是要注意串行隊列大小用於保護共享資源。如果您只是試圖對資源執行定期檢查(一項永遠不會寫入且只能讀取的任務),那麼使用併發隊列會更好(您應該只使用4 given global queues,

之一

還是因爲你似乎永遠在整個應用程序的生命週期檢查,你甚至可以考慮使用一個Dispatch Source,更具體地說是定時調度來源

0

我覺得這可能是一個Xcode調試的問題,因爲我不能複製它同時在Xcode之外運行應用程序: -/