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