选择文件/目录后立即关闭NSOpenPanel

时间:2011-01-14 07:42:05

标签: cocoa nsoperation nsopenpanel

我是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代码,看起来就是这样。

1 个答案:

答案 0 :(得分:1)

两个注释:

首先,在Cocoa中,事件处理和绘图发生在主线程上。因此,在那里同步调用冗长的方法永远不是一个好主意(这就是你的UI没有响应的原因)。
所以是的,你应该将计算成本高昂的任务交给这个方法的辅助线程,就像从任何IBAction那样。

其次,在该方法中调用[panel release]违反了Cocoa的对象所有权规则!因此,如果您在没有调用的情况下泄漏面板,则应该在创建面板的方法中修复它。