我是NSOpenPanel / NSSavePanel / NSPanel的新手。我正在使用NSOpenPanel来选择一个目录,我的应用程序将迭代这些目录,并进行一些相当耗时的处理。
我可以在面板上调用-close,但这不会将焦点返回到主窗口。我已经阅读了很多关于“解雇”小组的内容 - 但我没有找到任何“解雇”而不是“关闭”小组或窗口的方法。
是否只需要生成后台线程(NSOperation)?
这是我的-chooseDidEnd:returnCode:contextInfo:
-(void) chooseDidEnd:(NSOpenPanel *)panel returnCode:(int)returnCode contextInfo:(void *)contextInfo
{
[panel orderOut:self];
[panel release];
if (returnCode == NSFileHandlingPanelOKButton)
{
[progressIndicator startAnimation:self];
[self doLotsOfTimeConsumingWork:[[panel URL] path]];
[progressIndicator stopAnimation:self];
}
}
虽然NSOpenPanel确实消失了,但是我的NSProgressIndicator没有动画,主窗口在 -doLotsOfTimeConsumingWork:完成后之后才会生效。
更新 刚看了NSOperationSample代码,看起来就是这样。
答案 0 :(得分:1)
两个注释:
首先,在Cocoa中,事件处理和绘图发生在主线程上。因此,在那里同步调用冗长的方法永远不是一个好主意(这就是你的UI没有响应的原因)。
所以是的,你应该将计算成本高昂的任务交给这个方法的辅助线程,就像从任何IBAction
那样。
其次,在该方法中调用[panel release]
违反了Cocoa的对象所有权规则!因此,如果您在没有调用的情况下泄漏面板,则应该在创建面板的方法中修复它。