1

免責事項: 私は 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") がモーダル アラートが閉じられた直後ではなく、モーダル アラートが閉じられた後も実行されるのですか?

4

2 に答える 2

0

[alert runModal] は、アラートが解除されるまで戻りません。シートとしてアタッチできるウィンドウがある場合は、 beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo: を使用できるはずです。これにより、アラートが閉じられたときにセレクターがコールバックされます (ブロックされません)。

于 2013-03-28T22:55:57.513 に答える