while for ejercicios ejemplos ciclo bucles bucle iphone ios ipad nsobject performselector

iphone - for - ¿Cómo llamar a un método lo antes posible pero lo antes posible en la siguiente iteración del bucle de ejecución?



ejercicios de bucles en java (4)

Bastante trivial utilizando GCD (Grand Central Dispatch):

dispatch_async (dispatch_get_main_queue (), ^{ NSLog (@"This stuff runs in the next iteration of the main run loop"); });

Necesito una forma segura de decir: "iOS, quiero que este método se ejecute lo antes posible, pero NO en ESTA iteración del bucle de ejecución. Lo antes posible en la próxima, pero no en esta. Gracias".

Ahora mismo siempre lo hago así:

[self performSelector:@selector(doSomethingInNextRunLoop) withObject:nil afterDelay:0]; [self doSomeOtherThings];

Con el supuesto de que -doSomeOtherThings siempre se realizará ANTES de -doSomethingInNextRunLoop .

La documentación dice:

La especificación de un retardo de 0 no necesariamente hace que el selector se realice inmediatamente. El selector aún está en cola en el bucle de ejecución del hilo y se realiza tan pronto como sea posible.

Entonces, básicamente, puede suceder que el método se llame inmediatamente como si acabara de enviar un mensaje directo, lo que provoca que -doSomethingInNextRunLoop se ejecute antes de -doSomeOtherThings ?

¿Cómo puedo estar absolutamente seguro de que se llamará lo antes posible pero NUNCA en esta misma iteración de bucle de ejecución?

Para aclarar la redacción: Con bucle de ejecución me refiero al hilo principal y a la iteración en la que todos los métodos deben regresar hasta que el hilo esté nuevamente listo para nuevos eventos.


Creo que la conclusión de leer la documentación es incorrecta.

Entonces, básicamente, puede suceder que el método sea llamado inmediatamente como si acabara de enviar un mensaje directo

No. La parte de la documentación que cita dice que el selector siempre está en cola en el bucle de ejecución, pase lo que pase. Por lo tanto, nunca se ejecutará como un mensaje directo.

La primera oración con el "no necesariamente" puede ser un poco engañosa, pero creo que la segunda oración realmente debería aclarar que lo que temes no va a pasar.


Seguramente solo haces esto;

[self doSomeOtherThings]; [self performSelector:@selector(doSomethingInNextRunLoop) withObject:nil afterDelay:0];

Lo que garantiza la orden de ejecución que desee.


Si le preocupa que Apple pueda algún día un caso especial con un retraso de 0, siempre puede especificar un retraso de 1e-37 o menos. Aunque la documentación para performSelector:withObject:afterDelay: podría leerse fácilmente para garantizar que el selector siempre se programará para la siguiente iteración del bucle de ejecución.

Si le preocupa que Apple pueda algún día demorar en casos especiales menos que algún límite inferior arbitrario, siempre podría intentar usar el performSelector:target:argument:order:modes: de performSelector:target:argument:order:modes: que la documentación establece específicamente que programará la ejecución para la próxima iteración de bucle de ejecución.