2

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

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

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

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

4

1 回答 1

8

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

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

我建议阅读 Apple 的线程编程指南以获取更多信息。

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

于 2012-01-11T23:15:54.767 回答