2011-02-09 14 views
18

Después de leer la documentación de NSRunLoop, no entendí mucho. Estoy generando un hilo secundario que tiene un NSTimer que se inicia cada 1 seg. Que actualizar una etiqueta en la pantalla con el performSelectorOnMainThread ..¿Qué es un runloop?

Sin embargo, para que funcione, necesitaba un runloop, pero no entiendo el concepto de ello?

¿Alguien que podría tratar de explicarlo?

Gracias.

Respuesta

27

Un bucle de ejecución es efectivamente:

while(... get an event ...) 
    ... handle event ...; 

Se ejecuta en un hilo; el hilo principal tiene el bucle de evento principal donde se procesan los eventos del usuario y se produce la mayoría de los dibujos UI, etc. El documentation explains it in detail.

Sin embargo, en su caso, no necesita un hilo.

Parece que todo lo que hace es actualizar periódicamente una etiqueta en la interfaz de usuario; algo que no es terriblemente computacional.

Simplemente programe su temporizador en el hilo principal y termine con él. No es necesario hacer girar un hilo, usando performSelectorOnMainThread:, ni incurrir en todas las complejidades para garantizar la coherencia de los datos entre los hilos.


Lo siento, no entendí su pregunta.

Internamente, un ciclo de ejecución funciona básicamente colocando un indicador en el ciclo de ejecución que dice "después de que transcurra este tiempo, active el temporizador". No hay hilos adicionales involucrados y, mejor aún, no es una encuesta para verificar la hora. Piense en un ciclo de ejecución como el mantenimiento efectivo de una línea de tiempo. Dejará transcurrir pasivamente el tiempo hasta que se encuentre algo de interés en la línea de tiempo (todo sin sondeo).

Significa, sin embargo, que un temporizador nunca será 100% preciso . Además, si tienes un temporizador repitiendo cada segundo, va a la deriva con el tiempo.

También; en lugar de desencadenar directamente un evento de dibujo. Su temporizador debe invalidar la vista que necesita actualización, luego deje que los objetos subyacentes se ocupen cuando sea mejor actualizar la pantalla.

+2

El temporizador no será 100% exacto, pero no se desplazará con el tiempo. El documento dice "Un temporizador repetitivo se reprograma automáticamente en función del tiempo de encendido programado, no del tiempo real de encendido. Por ejemplo, si un temporizador está programado para disparar a una hora determinada y cada 5 segundos después, el tiempo de encendido programado siempre caerá los intervalos de tiempo originales de 5 segundos, incluso si el tiempo real de encendido se retrasa – CarmeloS

+0

Ese es un nuevo comportamiento. Solían derivar con el tiempo. – bbum

+0

Creo que debería poner la versión del sistema a partir de la cual cambió el comportamiento aquí para que otros, incluido yo , puede usar temporizadores correctamente. ¿Te importaría? – CarmeloS

12

This page lo explica bastante bien. FTA:

Un bucle de ejecución es esencialmente un bucle de procesamiento de eventos que se ejecuta en un solo hilo. Registre posibles fuentes de entrada en él, apunte al código que debe ejecutar cada vez que la entrada esté disponible en esas fuentes.

+0

@Rodrige, ¡Gracias! Entonces, ¿es esencialmente un tercer hilo el que ejecuta el código cuando ocurre un evento? – LuckyLuke

+0

No, en absoluto. La descripción anterior es precisa, pero - no - no necesita un tercer hilo para manejar el temporizador del segundo hilo para publicar eventos en el ciclo del evento principal. – bbum

+0

@bbum No, sé que no necesito hacer una tercera, pero es un tercer hilo que funciona detrás de escena, eso es lo que quise decir, ¿es correcto? – LuckyLuke