Frage

Ich habe eine App mit einem Button 'convert'. Wenn ich auf diese Schaltfläche klicken, wird die App startet einen neuen Prozess NSTask und anschließend abgeblendet die Taste, bis der Prozess abgeschlossen ist.

Mein Problem ist, die App alle Klicks sparen durch den Benutzer, während er darauf wartet, dass der Prozess zu beenden. Also auch wenn die Taste abgeblendet ist, kann der Benutzer darauf klicken, und der Prozess wird sofort wieder starten, sobald es fertig ist.

Ich warte auf den Prozess zu beenden mit:

[task waitUntilExit];

Wie ignoriere ich einen Benutzereingabe während des Wartens auf diese Aufgabe zu beenden?

War es hilfreich?

Lösung

-[NSTask waitUntilExit] ist, natürlich, ein blockierenden Anruf. Das heißt, die Faden Pausen (wie auch die Laufschleife) und alle Ereignisse, die zu dem Thread gesendet werden, bis die Laufschleife Warteschlange gestellt diese verarbeiten kann.

Statt waitUntilExit ich so etwas tun würde:

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

Dies wird Ihre Aufgabe starten, deaktivieren Sie die Taste, aber nicht den Faden blockieren, weil Sie nicht darauf warten zu beenden. Stattdessen Sie warten für die asynchrone Benachrichtigung, wenn die Aufgabe beendet hat. Da die Taste, bis die Aufgabe beendet, deaktiviert ist, wird diese alle Ereignisse ignoriert an ihn gesendet.

Andere Tipps

noch einfacher:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top