Cocoa的事件驱动系统:后台任务在哪里运行?

时间:2012-01-11 23:10:08

标签: cocoa user-interface nsrunloop event-driven

在Mac OS X上,Cocoa是事件驱动的。我的意思是每个东西都是由UI驱动的 - 用户点击某个东西或移动某个区域会导致调用事件处理程序。 Main简单地调用NSApplicationMain(),它会创建一个无限循环,直到程序退出。

虽然不是用户驱动的任务呢?我会在哪里放置需要在后台工作的任务来提供程序的基本功能?例如,Photo Booth在用户与UI交互时执行某些操作(即,当用户单击某个按钮时更改为摄像机)。但是,Photo Booth还不断从相机中检索帧以提供视频流。

所以我的问题是非UI任务代码在哪里? Main()实际上不是一种可能,因为我需要在程序的整个生命周期中运行任务,而不是在程序刚启动时运行。

我在Mac OS X Snow Leopard上(我想要一些适用于所有Mac系统的东西:即Lion OS X)并在Xcode中使用Obj-C Cocoa应用程序。

1 个答案:

答案 0 :(得分:8)

任何基于应用程序的应用程序都可以使用RunLoops

您的应用程序想要做的任何工作都会使用RunLoop来执行。通常,这是在其他线程上完成的,但如果工作量很轻,不会导致UI线程阻塞,则可以在主线程RunLoop上运行代码。

我建议您阅读Apple的Thread Programming Guide以获取更多信息。

使用Grand Central Dispatch,编程模型已经改变以利用当今的多核系统,因此可以定义任务并让操作系统管理它的执行。