1

当我的应用程序启动时,我正在执行一个冗长的操作。我正在使用模态 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 相同。我假设(基于整天花在这上面)模式运行循环希望在事件处理期间停止(比如按下关闭按钮)。

为了完成这个看似简单的任务,我是否缺少一些明显的东西?谢谢!

4

0 回答 0