我的可可应用程序中有2个窗口。主窗口打开一个子窗口。在子窗口上单击OK时,我在主窗体上调用一个deligate,它将告诉在子窗口上单击OK按钮。
现在,我需要在“后台”主窗口上运行一个长时间运行的进程,这样窗口就不会无响应。我也有进度条,应该显示这个长时间运行过程的进展。
请告诉我,实现这一目标的最佳途径是什么。
答案 0 :(得分:4)
您应该从Apple的Concurrency Programming Guide开始。
特别是关于NSOperationQueue的部分。
答案 1 :(得分:4)
您可以使用 Grand Central Dispatch 。首先,创建一个调度队列,它将包含您要在另一个线程上执行的操作。每个操作都表示为Objective-C块(闭包)。
首先,你得到一个队列,把你想要在另一个线程上运行的任务。
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
然后放置一个代表您要在此队列中执行的工作的块:
dispatch_async(queue, ^{
// this happens on separate thread
NSImage *image = produceImageFromSomeReallySlowOperation()
dispatch_async(dispatch_get_main_queue(), ^{
// this happens on main thread
[myView setImage:image];
});
});
dispatch_get_main_queue()
函数返回用于主线程(执行GUI)的操作的队列。这意味着[myView setImage:image]
将在主线程上执行。您可以在此处放置进度条的更新。只需调度主队列即可更新算法中每个点的进度,这样做是有意义的。
所有这些也可以使用NSOperation
执行,{{1}}为相同的功能提供更高级别的Objective-C接口。但直接使用GCD有时更容易。这取决于你想做什么。