我有一个多线程应用程序,它同时进行了许多并发操作。当每个线程完成时,它会调用主线程上的两个方法之一
performSelectorOnMainThread:@selector(operationDidFinish:)
// and
performSelectorOnMainThread:@selector(operationDidFail:withMessage:)
当操作失败时,我启动一个显示错误消息的工作表并向用户显示 2 个按钮,“取消”和“重试”。这是我用来启动工作表的代码:
// failureSheet is a NSWindowController subclass
[NSApp beginSheet:[failureSheet window]
modalForWindow:window
modalDelegate:self
didEndSelector:@selector(failureSheetDidEnd:returnCode:contextInfo:)
contextInfo:nil];
问题是,如果 2 个并发操作同时失败,那么当前显示的工作表会被最后一个失败消息覆盖,然后用户的“重试”操作只会重试最后一个失败的操作。理想情况下,我想将这些故障表“排队”。如果 2 个操作同时失败,那么您应该看到 2 个工作表一个接一个,允许用户单独取消或重试它们。
我试过使用:
[NSApp runModalSessionForWindow:[failureSheet window]]
这似乎做了我想要的,但在我的情况下不起作用。也许它不是线程安全的?
例如下面的代码工作......
- (void)displaySheet
{
[NSApp beginSheet:[failureSheet window]
modalForWindow:window
modalDelegate:self
didEndSelector:@selector(failureSheetDidEnd:returnCode:contextInfo:)
contextInfo:nil];
[NSApp runModalForWindow:[failureSheet window]];
[NSApp endSheet:[failureSheet window]];
[[failureSheet window] orderOut:nil];
}
// Calling this method from a button press works...
- (IBAction)testDisplayTwoSheets
{
[self displaySheet];
[self displaySheet];
}
但是,如果我有 2 个不同的线程操作在完成时调用 displaySheet(在主线程上),我只会看到一张纸,当我关闭它时,模态会话仍在运行,我的应用程序基本上被卡住了。
关于我做错了什么的任何建议?