免责声明:在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(@“运行后模态”)在模态警报被解除后很久才被执行,而不是在模态警报被解除后立即执行?
答案 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:当警报关闭(而不是阻止)时,它将回调选择器。