在我的基于文档的应用程序中,我已经覆盖了方法openDocument:在我的NSDocumentcontroller的子类中,以便我可以显示自己的openPanel。我将所选的URL传递给方法openDocumentWithContentsOfURL:display:completionHandler:。我使用此代码进行调用:
[self openDocumentWithContentsOfURL:[chosenFiles objectAtIndex:i] display:YES completionHandler:^(NSDocument *document, BOOL documentWasAlreadyOpen, NSError *error) {
if (document == nil)
{
NSAlert* alert = [NSAlert alertWithError:error];
[alert runModal];
}
}];
因此,如果将nil作为对文档的引用返回,我想显示传递的错误。问题是,按下打开面板中的“打开”按钮后,程序只是“冻结”。然后我需要使用Xcode中的“停止”按钮手动停止程序。但是,没有旋转沙滩球出现。如果我对“[alert runModal]”行进行注释,程序不会再冻结,但当然不会显示警告。
现在奇怪的是:代码有时 。如果我从Xcode切换到我的浏览器并返回并再次运行程序,它有时会完美无缺地运行并显示错误。一段时间后它再次停止工作。这是不可预测的,但大多数时候它不起作用。
这对我来说听起来像是一场竞赛。它当然与块有关?但是我做错了什么?
答案 0 :(得分:1)
将我的评论转换为答案:
主线程上的runModel。
[alert performSelectorOnMainThread:@selector(runModal) withObject:nil waitUntilDone:NO];
我认为需要在主线程上调用runModel,因为它是AppKit框架的一部分,并且它可能会触发UI图形。我相信所有对AppKit框架或任何操纵图形的方法的调用都需要在主线程上。