Игнорирование ввода пользователя во время ожидания задачи - 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];