Игнорирование ввода пользователя во время ожидания задачи - Objective-C - PullRequest
1 голос
/ 30 ноября 2009

У меня есть приложение с кнопкой «конвертировать». Когда я нажимаю эту кнопку, приложение запускает новый процесс, используя NSTask, а затем отключает кнопку до тех пор, пока процесс не завершится.

Моя проблема в том, что приложение сохраняет все клики, сделанные пользователем, пока оно ожидает завершения процесса. Поэтому, даже если кнопка неактивна, пользователь может щелкнуть ее, и процесс сразу же начнется сразу же после ее завершения.

Я жду окончания процесса использования:

[task waitUntilExit];

Как мне игнорировать любой пользовательский ввод при ожидании завершения этой задачи?

Ответы [ 2 ]

6 голосов
/ 30 ноября 2009

-[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];
}

Это запустит вашу задачу, отключит кнопку, но не заблокирует поток, потому что вы не дожидаетесь его завершения. Вместо этого вы ожидаете асинхронного уведомления о том, когда задача заканчивается. Поскольку кнопка отключена до завершения задачи, она будет игнорировать все отправленные ей события.

0 голосов
/ 16 марта 2011

еще проще:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];
...