2013-03-28 30 views
1

聲明:在OSX開發中,我是初學者。運行後臺任務時的OSX警報

我有一個名爲「checkUser」的方法。在該方法中,我需要檢查輸入的用戶憑證是否有效。爲了檢查憑證是否有效,我需要調用一個名爲「methodThatInvolvesNetwork」的方法,其執行時間可能會有所不同,因爲它涉及網絡連接。在「checkUser」中,我需要顯示一個警報,顯示「methodThatInvolvesNetwork」正在運行時的進度。用戶也可以取消警報,這也將取消正在運行的「methodThatInvolvesNetwork」。 Q1)我應該怎麼做?

請注意,「checkUser」的執行被阻止,而「methodThatInvolvesNetwork」在「checkUser」中被調用是必須的。

我目前有此實現:

- (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(@「After run modal」)在模態警報解除後很久才執行,而不是在模態警告解除後立即執行?

回答

1

要回答我的問題,這是我曾經使用過滿足的要求:

  • 與NSWindowController一個NSWindow。
    此窗口將在窗口的加載背景中運行「methodThatInvolvesNetwork」。

  • 內部 「checkUser」,我實例化上面的窗口, 「mywindow的」,然後將其傳遞到:

  • Geowar的回答以上(但沒有didEndSelector):

    [NSApp beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo:]

  • 上面的行之後,我使用運行它作爲模態:

    [NSApp runModalForWindow:myWindow];

    ,以便「checkUser」的執行被阻止。

  • 當「myWindow」結束時(當調用stopModal或abortModal時),則執行「checkUser」將繼續。

0

[alert runModal]將不會返回,直到警報解除。如果有一個窗口可以附加到表單中,那麼您應該可以使用beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo:它將在警報關閉(而不是阻止)時回調選擇器。

+0

我需要警報被阻止,以便「checkUser」的返回值基於「methodThatInvolvesNetwork」。 – MiuMiu 2013-03-29 00:48:38