当我的应用程序启动时,我正在执行一个冗长的操作。我正在使用模态 NSWindow 在整个操作过程中显示我的进度条和消息。
我想要完成的是当操作完成运行时,自动关闭窗口,并结束模态运行循环并继续程序的其余部分。我在窗口控制器中尝试了三种不同的方法:
方法一:
- (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];
}];
}];
}
结果:窗口一直停留在屏幕上,直到我移动鼠标(或执行某种“事件”),然后事情继续按预期进行。
方法二:
- (void)windowDidLoad
{
[self.op addOperationWithBlock:^{
[self performMigration];
[NSApp stopModal];
[self close];
}];
}
结果:窗口关闭,但主运行循环不会继续,直到移动鼠标(如上)。
方法三:
- (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 相同。我假设(基于整天花在这上面)模式运行循环希望在事件处理期间停止(比如按下关闭按钮)。
为了完成这个看似简单的任务,我是否缺少一些明显的东西?谢谢!