2009-11-30 2 views
1

J'ai une application avec un bouton 'convertir'. Lorsque je clique sur ce bouton, l'application démarre un nouveau processus en utilisant NSTask puis grise le bouton jusqu'à la fin du processus.Ignorer la saisie utilisateur en attente d'une tâche - Objective-C

Mon problème est, 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 recommencera immédiatement dès qu'il sera terminé.

J'attends la fin du processus en utilisant:

[task waitUntilExit]; 

Comment puis-je ignorer toutes les entrées de l'utilisateur en attendant cette tâche pour terminer?

Répondre

6

-[NSTask waitUntilExit] est, bien sûr, un appel de blocage. Cela signifie que le thread s'arrête (tout comme 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]; 
} 

Cela lancera votre tâche, désactivez le bouton, mais pas bloquer le fil, parce que vous vous attendez pas à la fin. Au lieu de cela, vous attendez la notification asynchrone à chaque fois que la tâche se termine. Comme le bouton est désactivé jusqu'à la fin de la tâche, tous les événements qui lui sont envoyés seront ignorés.

0

encore plus facile:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];