当我的应用程序启动时,我正在执行一个冗长的操作。我正在使用模态NSWindow在整个操作过程中显示我的进度条和消息。
我想要完成的是当操作完成运行时,自动关闭窗口,并结束模态运行循环并继续执行程序的其余部分。我在窗口控制器中尝试了三种不同的方法:
方法1:
- (void)windowDidLoad
{
// self.op is an initialized NSOperationQueue set before this method is called
[self.op addOperationWithBlock:^{
[self performMigration]; // The method that does all the background work (works fine)
[NSApp stopModal];
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self close];
}];
}];
}
结果:窗口停留在屏幕上,直到我移动鼠标(或执行某种类型的'事件')然后事情继续如预期一样。
方法2:
- (void)windowDidLoad
{
[self.op addOperationWithBlock:^{
[self performMigration];
[NSApp stopModal];
[self close];
}];
}
结果:窗口关闭,但主要运行循环不会继续,直到移动鼠标(如上所述)。
方法3:
- (void)windowDidLoad
{
// Get the thread of the modal loop
self.callbackThread = [NSThread currentThread];
[self.op addOperationWithBlock:^{
[self performMigration];
[self performSelector:@selector(callback) onThread:self.callbackThread withObject:nil waitUntilDone:NO];
}];
}
- (void)callback
{
[NSApp stopModal];
[self close];
}
与#2相同的结果。我假设(基于花费一整天的时间),在事件处理期间想要停止模态运行循环(比如按下关闭按钮)。
是否有一些显而易见的东西让我无法完成这项看似简单的任务?谢谢!