Forma adecuada de retrasar mientras se permite que el ciclo de ejecución continúe

Tengo la necesidad de demorar un time determinado y, sin embargo, permitir que otras cosas en el mismo runloop sigan ejecutándose. He estado usando el siguiente código para hacer esto:

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]]; 

Esto parece hacer exactamente lo que quiero, excepto que a veces la function vuelve inmediatamente sin esperar el time deseado (1 segundo).

¿Alguien me puede decir qué podría causar esto? ¿Y cuál es la forma correcta de esperar mientras se permite que se ejecute el ciclo de ejecución?

NOTA: Quiero retrasar de manera similar a sleep (), de modo que después del retraso, vuelva a estar en la misma secuencia de ejecución que antes.

Debería usar GCD y dispatch_after para eso. Es mucho más reciente y eficiente (y seguro para todo tipo de hilos) y es muy fácil de usar.

Incluso hay un fragment de código embedded en Xcode, por lo que si comienza a escribir dispatch_after sugerirá el fragment y si lo valida escribirá las 2 a 3 líneas preparadas para usted en su código 🙂

Sugerencia de Snippet de código por Xcode

 int64_t delayInSeconds = 2.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ <#code to be executed on the main queue after delay#> }); 

Use un NSTimer para disparar una llamada a algún método después de un cierto retraso.

La respuesta SO aceptada aquí debería ayudar. También puede implementar el service de despacho de David ( explicado aquí ), que es una forma más actualizada de hacer lo mismo, usando GCD.

Hay varias funciones GCD como esta que vale la pena conocer, y son muy fáciles de usar.

¿Has probado performSelector:withObject:afterDelay: 😕

De la documentation de Apple

Invoca un método del receptor en el hilo actual utilizando el modo pnetworkingeterminado después de un retraso.

Tuve un problema similar y esta es mi solución. Espero que también funcione para otros.

 __block bool dispatched = false; while ( put your loop condition here ) { if (dispatched) { // We want to relinquish control if we are already dispatched on this iteration. [ [ NSRunLoop currentRunLoop ] runMode: NSDefaultRunLoopMode beforeDate:[ NSDate date ] ]; continue; } // mark that a dispatch is being scheduled dispatched = true; int64_t delayInNanoSeconds = (int64_t) (0.1 * (float) NSEC_PER_SEC); dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, delayInNanoSeconds); dispatch_after(delayTime, dispatch_get_main_queue(), ^() { // Do your loop stuff here // and now ready for the next dispatch dispatched = false; } ); } // end of while