En la documentación de Apple para NSRunLoop, hay un código de muestra que demuestra la suspensión de la ejecución mientras se espera que una bandera sea configurada por otra cosa.¿La mejor manera de hacer que NSRunLoop espere a que se establezca una bandera?
BOOL shouldKeepRunning = YES; // global
NSRunLoop *theRL = [NSRunLoop currentRunLoop];
while (shouldKeepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
He estado usando este y funciona, pero en la investigación de un problema de rendimiento que lo rastreó a este pedazo de código. Uso casi exactamente el mismo fragmento de código (solo el nombre de la bandera es diferente :) y si pongo un NSLog
en la línea después de que se está configurando la bandera (en otro método) y luego una línea después del while()
, hay un aparentemente aleatorio espera entre las dos declaraciones de registro de varios segundos.
La demora no parece ser diferente en máquinas más lentas o más rápidas, pero varía de una ejecución a otra por al menos un par de segundos y hasta 10 segundos.
He solucionado este problema con el siguiente código, pero no parece correcto que el código original no funcione.
NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
while (webViewIsLoading && [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:loopUntil])
loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
utilizando este código, las declaraciones de registro cuando el ajuste de la bandera y después del bucle, mientras que ahora son consistentemente menos de 0,1 segundos de diferencia.
¿Alguien alguna idea de por qué el código original muestra este comportamiento?
Creo que entendió mal el ejemplo dado en la documentación; el uso de este código de ejemplo es cuando desea finalizar la ejecución de un runloop (no recibir notificaciones sobre el cambio de indicador) https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/ NSRunLoop_Class/Reference/Reference.html # // apple_ref/occ/instm/NSRunLoop/run – kernix