运行后台任务时的OSX警报

时间:2013-03-28 10:20:05

标签: macos cocoa alert

免责声明:在OSX开发方面,我是初学者。

我有一个名为“checkUser”的方法。在该方法中,我需要检查输入的用户凭证是否有效。要检查凭据是否有效,我需要调用一个名为“methodThatInvolvesNetwork”的方法,其执行时间可能会有所不同,因为它涉及网络连接。在“checkUser”中,我需要在“methodThatInvolvesNetwork”运行时显示一条显示进度的警报。用户也可以取消警报,这也将取消正在运行的“methodThatInvolvesNetwork” Q1)我该怎么做呢?

请注意,必须阻止“checkUser”的执行,并在“checkUser”中调用“methodThatInvolvesNetwork”。

我目前有这个实现:

- (BOOL)checkUser
{
    NSAlert *alert = [NSAlert alertWithMessageText:@"Sample" defaultButton:@"Okay" alternateButton:nil otherButton:nil informativeTextWithFormat:@""];
    self.alert = alert;
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        [self methodThatInvolvesNetwork];
    });

    [alert runModal];
    NSLog(@"After run modal");
}

- (void)methodThatInvolvesNetwork
{
    // Do long running task here.

    dispatch_async(dispatch_get_main_queue(), ^{

        if (self.alert != nil)
        {
            [[self.alert window] orderOut:self.alert];
            [[NSApplication sharedApplication] stopModal];
        }
    });
}

Q2)我的实施是否在正确的方式上实现呢? Q3)如果是,那么为什么NSLog(@“运行后模态”)在模态警报被解除后很久才被执行,而不是在模态警报被解除后立即执行?

2 个答案:

答案 0 :(得分:1)

要回答我自己的问题,这就是我所使用的符合要求的内容:

  • 带有NSWindowController的NSWindow 该窗口将在窗口加载后的后台运行“methodThatInvolvesNetwork”。

  • 在“checkUser”中,我实例化了上面的窗口“myWindow”,然后将其传递给:

  • Geowar上面的答案(但没有didEndSelector):

    [NSApp beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo:]

  • 在上面一行之后,我使用以下方式将其作为模态运行:

    [NSApp runModalForWindow:myWindow];

    以便阻止执行“checkUser”。

  • 当“myWindow”结束时(调用stopModal或abortModal时),“checkUser”的执行将继续。

答案 1 :(得分:0)

在警报被取消之前,

[alert runModal]将不会返回。如果有一个窗口你可以将它作为工作表附加,那么你应该能够使用beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo:当警报关闭(而不是阻止)时,它将回调选择器。