Pregunta

Tengo una aplicación con el botón 'convertir'. Cuando hago clic en este botón, la aplicación comienza un nuevo proceso con NSTask y luego atenúa el botón hasta que finaliza el proceso.

Mi problema es que la aplicación guarda los clics realizados por el usuario mientras espera que finalice el proceso. Por lo tanto, aunque el botón esté atenuado, el usuario puede hacer clic en él y el proceso comenzará de inmediato tan pronto como termine.

Estoy esperando que el proceso termine de usar:

[task waitUntilExit];

¿Cómo ignoro cualquier entrada del usuario mientras espero que termine esta tarea?

¿Fue útil?

Solución

- [NSTask waitUntilExit] es, por supuesto, una llamada de bloqueo. Eso significa que el subproceso se detiene (al igual que el ciclo de ejecución) y todos los eventos que se envían al subproceso se ponen en cola hasta que el ciclo de ejecución puede procesarlos.

En lugar de waitUntilExit , haría algo como esto:

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

Esto iniciará su tarea, deshabilitará el botón, pero no bloqueará el hilo, porque no está esperando que termine. En cambio, está esperando la notificación asincrónica de cuando finaliza la tarea. Dado que el botón está desactivado hasta que finalice la tarea, esto ignorará todos los eventos que se le envíen.

Otros consejos

aún más fácil:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top