Question

J'ai une application avec un bouton "convertir". Lorsque je clique sur ce bouton, l'application démarre un nouveau processus à l'aide de NSTask, puis estompe le bouton jusqu'à ce que le processus se termine.

Mon problème est que l'application enregistre tous les clics effectués par l'utilisateur pendant qu'il attend la fin du processus. Ainsi, même si le bouton est grisé, l'utilisateur peut cliquer dessus et le processus reprend immédiatement dès qu'il se termine.

J'attends la fin du processus avec:

[task waitUntilExit];

Comment ignorer les saisies de l'utilisateur en attendant la fin de cette tâche?

Était-ce utile?

La solution

- [NSTask waitUntilExit] est bien entendu un appel bloquant. Cela signifie que le thread se met en pause (de même que la boucle d'exécution) et que tous les événements envoyés au thread sont mis en file d'attente jusqu'à ce que la boucle d'exécution puisse les traiter.

Au lieu de waitUntilExit , je ferais quelque chose comme ceci:

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

Ceci lancera votre tâche, désactivera le bouton, mais ne bloquera pas le fil, car vous n'attendez pas qu'il se termine. Au lieu de cela, vous attendez la notification asynchrone de la fin de la tâche. Le bouton étant désactivé jusqu'à la fin de la tâche, tous les événements qui lui sont envoyés seront ignorés.

Autres conseils

encore plus facile:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top