Cocoa 可可';s事件驱动系统:后台任务在哪里运行?

Cocoa 可可';s事件驱动系统:后台任务在哪里运行?,cocoa,user-interface,nsrunloop,event-driven,Cocoa,User Interface,Nsrunloop,Event Driven,在MacOSX上,Cocoa是事件驱动的。我的意思是,每件事都是由UI驱动的——用户单击某个东西或在某个区域上移动会导致调用事件处理程序。Main只调用NSApplicationMain(),这将创建一个无限循环,直到程序退出 但对于非用户驱动的任务呢?我将把需要在后台工作以提供程序基本功能的任务放在哪里?例如,当用户与UI交互时,Photo Booth会执行某些操作(即,当用户单击某个按钮时,会更改为摄像机)。然而,Photo Booth也在不断地从摄像机中检索帧以提供视频流 所以我的问题是非

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

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

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


我使用的是Mac OS X Snow Leopard(不过我想要的是在所有Mac系统上都能工作的东西:即Lion OS X),我在Xcode中使用的是Obj-C Cocoa应用程序

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

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

我建议阅读苹果的更多信息


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

谢谢,线程听起来很完美。我需要一个集中的地方来声明所有变量并启动线程。我该在哪里做这件事呢?最终,你的任务总是会运行以响应某些事情(即使某些事情是“时间流逝”或“应用程序启动”)。对于类似于Photo Booth示例的内容,它将运行以响应来自视频捕获库的回调。对于网络应用程序,它将响应网络上的传入数据包而运行。“事件驱动”不仅仅适用于GUI事件。如果我想让它由应用程序启动“驱动”,我会像在控制台应用程序中一样将它放在main中吗?@Farhad:No.
main
几乎总是一行,除了调用
NSApplicationMain
之外什么都不做。您通常会在应用程序的委托中设置您正在谈论的内容,或者在基于文档的应用程序中,设置每个文档。