Domanda

Ho un'app con un pulsante 'converti'. Quando faccio clic su questo pulsante, l'app avvia un nuovo processo utilizzando NSTask e quindi il pulsante viene visualizzato in grigio fino al termine del processo.

Il mio problema è che l'app salva tutti i clic effettuati dall'utente mentre attende che il processo finisca. Pertanto, anche se il pulsante è disattivato, l'utente può fare clic su di esso e il processo ricomincerà immediatamente al termine.

Sto aspettando che il processo finisca con:

[task waitUntilExit];

Come posso ignorare qualsiasi input dell'utente mentre aspetto che questa attività finisca?

È stato utile?

Soluzione

- [NSTask waitUntilExit] è, ovviamente, una chiamata bloccante. Ciò significa che il thread si interrompe (così come il ciclo di esecuzione) e tutti gli eventi inviati al thread vengono messi in coda fino a quando il ciclo di esecuzione non può elaborarli.

Invece di waitUntilExit , farei una cosa del genere:

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

Questo avvierà la tua attività, disabiliterà il pulsante, ma non bloccherà il thread, perché non stai aspettando che finisca. Invece, stai aspettando la notifica asincrona ogni volta che l'attività termina. Poiché il pulsante è disabilitato fino al termine dell'attività, questo ignorerà tutti gli eventi ad esso inviati.

Altri suggerimenti

ancora più semplice:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top