Ignorando a entrada do usuário enquanto espera para uma tarefa - Objective-C
-
08-07-2019 - |
Pergunta
Eu tenho um aplicativo com um 'converter' botão. Quando eu clicar nesse botão, o aplicativo inicia um novo processo usando NSTask e depois cinzas para fora o botão até que o processo termine.
O meu problema é, o aplicativo salva quaisquer cliques feitos pelo usuário enquanto ele está aguardando o processo de acabamento. Assim, mesmo que o botão é acinzentado, o usuário pode clicar nele e o processo começará imediatamente novamente assim que ele terminar.
Eu estou esperando para o processo de acabamento usando:
[task waitUntilExit];
Como posso ignorar qualquer entrada do usuário enquanto espera para esta tarefa ao fim?
Solução
-[NSTask waitUntilExit]
é, naturalmente, uma chamada de bloqueio. Isso significa que as pausas de rosca (como faz o loop de execução) e todos os eventos que são enviados para o segmento estejam na fila até que o loop de execução pode processá-los.
Em vez de waitUntilExit
, eu faria algo assim:
- (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];
}
Isto irá iniciar a sua tarefa, desativar o botão, mas não bloqueia o segmento, porque você não está esperando que ela termine. Em vez disso, você está esperando para a notificação assíncrona de sempre que a tarefa acabamentos. Uma vez que o botão é desativado até que a tarefa termina, este irá ignorar todos os eventos enviados a ele.
Outras dicas
ainda mais fácil:
[[UIApplication sharedApplication] beginIgnoringInteractionEvents];