2012-01-11 55 views
2

在Mac OS X上,Cocoa是事件驅動的。我的意思是,每一件事都是由用戶界面驅動的 - 用戶點擊某物或在特定區域移動會導致一個事件處理程序被調用。主要只是調用NSApplicationMain(),直到程序退出時創建一個無限循環。可可的事件驅動系統:後臺任務在哪裏運行?

那些不是用戶驅動的任務呢?我會在哪裏放置需要在後臺工作的任務,以提供程序的基本功能?例如,Photo Booth在用戶與UI交互時(即當用戶點擊某個按鈕時更改爲攝像機)會執行某些操作。然而,Photo Booth也不斷從相機中檢索幀以提供視頻流。

所以我的問題是非UI任務代碼去哪裏? Main()並不是真正的可能性,因爲我需要在整個程序生命週期中運行任務,而不是在程序剛啓動時運行。我想在Mac OS X Snow Leopard(我希望所有的Mac系統上都能工作:即Lion OS X),並且在Xcode中使用Obj-C Cocoa應用程序。

回答

8

任何應用程序基於可可的應用程序有權使用RunLoops

您的應用程序想要執行的任何工作都將使用RunLoop來執行。通常,這是在其他線程上完成的,但如果工作足夠輕量而不會導致UI線程阻塞,則可以在主線程RunLoop上運行代碼。

我建議您閱讀Apple的Thread Programming Guide瞭解更多信息。

隨着Grand Central Dispatch,編程模型已經改變,以利用今天的多核系統,所以可以定義一個任務,讓操作系統管理它的執行。

+0

謝謝,線程完美。我需要一個集中的地方來聲明所有變量並啓動線程。我會在哪裏做這件事? – fdh 2012-01-12 00:41:12

+1

最後,您的任務總是要運行以迴應某些事情(即使某些事情是「時間流逝」或「應用程序啓動」)。對於像Photo Booth這樣的示例,它將響應視頻捕獲庫的回調而運行。在網絡應用程序的情況下,它將響應網絡上的傳入數據包而運行。 「事件驅動」不僅適用於GUI事件。 – 2012-01-12 01:38:14

+0

如果我希望它被應用程序啓動「驅動」,我會把它放在主體中,就像在控制檯應用程序中一樣嗎? – fdh 2012-01-12 04:04:02