从NSOperation结束模态运行循环

时间:2012-10-30 03:11:15

标签: objective-c cocoa nsoperation nsoperationqueue

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

是否有一些显而易见的东西让我无法完成这项看似简单的任务?谢谢!

0 个答案:

没有答案