タスク待機中のユーザー入力を無視する-Objective-C
-
08-07-2019 - |
質問
「変換」ボタンのあるアプリがあります。このボタンをクリックすると、アプリはNSTaskを使用して新しいプロセスを開始し、プロセスが終了するまでボタンをグレー表示します。
私の問題は、アプリがプロセスの終了を待っている間にユーザーが行ったクリックを保存することです。そのため、ボタンがグレー表示されていても、ユーザーはそれをクリックでき、プロセスは終了するとすぐに再開されます。
プロセスの使用が終了するのを待っています:
[task waitUntilExit];
このタスクの完了を待っている間にユーザー入力を無視するにはどうすればよいですか
解決
-[NSTask waitUntilExit]
は、もちろんブロック呼び出しです。つまり、スレッドは一時停止し(実行ループと同様)、スレッドに送信されるすべてのイベントは、実行ループが処理できるまでキューに入れられます。
waitUntilExit
の代わりに、次のようなことをします:
- (IBAction) myButtonMethod {
NSTask * task = ....;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskFinished:) name:NSTaskDidTerminateNotification object:task];
[myButton setEnabled:NO];
[task launch];
}
- (void) taskFinished:(NSNotification *)note {
[myButton setEnabled:YES];
}
これにより、タスクが起動し、ボタンが無効になりますが、スレッドがブロックされることはありません。スレッドが完了するのを待っていないためです。代わりに、タスクが終了するたびに非同期通知を待っています。タスクが完了するまでボタンは無効になるため、送信されたすべてのイベントは無視されます。
他のヒント
さらに簡単:
[[UIApplication sharedApplication] beginIgnoringInteractionEvents];
所属していません StackOverflow