iphone - something - ¿Cómo funciona-performSelector: withObject: afterDelay: work?
post delay android studio (2)
Actualmente estoy trabajando bajo el supuesto de que -performSelector:withObject:afterDelay:
no utiliza el subprocesamiento, pero planifica un evento para disparar en una fecha posterior en el hilo actual. ¿Es esto correcto?
Más específicamente:
- (void) methodCalledByButtonClick {
for (id obj in array) {
[self doSomethingWithObj:obj];
}
}
static BOOL isBad = NO;
- (void) doSomethingWithObj:(id)obj {
if (isBad) {
return;
}
if ([obj isBad]) {
isBad = YES;
[self performSelector:@selector(resetIsBad) withObject:nil afterDelay:0.1];
return;
}
//Do something with obj
}
- (void) resetIsBad {
isBad = NO;
}
¿Está garantizado que -resetIsBad
no se -methodCalledByButtonClick
hasta después de que -methodCalledByButtonClick
regrese, suponiendo que se esté ejecutando en el hilo principal, incluso si -methodCalledByButtonClick
tarda un tiempo arbitrariamente largo en completarse?
De los docs :
Invoca un método del receptor en el hilo actual usando el modo predeterminado después de un retraso.
La discusión va más allá:
Este método configura un temporizador para realizar el mensaje aSelector en el ciclo de ejecución del subproceso actual. El temporizador está configurado para ejecutarse en el modo predeterminado (NSDefaultRunLoopMode). Cuando el temporizador se dispara, el hilo intenta quitar la cola del mensaje del ciclo de ejecución y realizar el selector. Tiene éxito si el ciclo de ejecución se está ejecutando y en el modo predeterminado; de lo contrario, el temporizador espera hasta que el ciclo de ejecución esté en el modo predeterminado.
De esto podemos responder su segunda pregunta. Sí, está garantizado , incluso con un retraso más corto, ya que el hilo actual está ocupado ejecutándose cuando se llama a performSelector
. Cuando el hilo vuelve al ciclo de ejecución y elimina el selector, habrá regresado de su methodCalledByButtonClick
.
performSelector:withObject:afterDelay:
programa un temporizador en el mismo hilo para llamar al selector después del retraso pasado. Si te registras para el modo de ejecución predeterminado (es decir, no utilices performSelector:withObject:afterDelay:inModes:
, creo que se garantiza que esperará hasta la próxima pasada del ciclo de ejecución, por lo que todo en la pila se completará primero.
Incluso si llama con un retraso de 0, esperará hasta el siguiente ciclo y se comportará como lo desee aquí. Para obtener más información, consulte los documentos .