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?

Foi útil?

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];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top