2012-08-23 21 views
74

¿Alguien puede explicar por qué es NSRunLoop? entonces sé que NSRunLoop es algo relacionado con NSThread ¿verdad? Así que supongo que crear un hilo comoComprender NSRunLoop

NSThread* th=[[NSThread alloc] initWithTarget:self selector:@selector(someMethod) object:nil]; 
[th start]; 

-(void) someMethod 
{ 
    NSLog(@"operation"); 
} 

así que después de este Tema termina su trabajo correcto? ¿Por qué usar RunLoops o dónde usar? de Apple Docs He leído algo pero no está claro para mí, así que explique lo más simple posible

+0

Esta pregunta es demasiado amplio en su alcance. Por favor, refine su pregunta a algo más específico. –

+1

al principio quiero saber qué hacer en genereal NSRunLoop y cómo se conecta con el hilo – taffarel

Respuesta

158

Un bucle de ejecución es una abstracción que (entre otras cosas) proporciona un mecanismo para manejar las fuentes de entrada del sistema (sockets, puertos , archivos, teclado, mouse, temporizadores, etc.).

Cada NSThread tiene su propio ciclo de ejecución, al que se puede acceder a través del método CurrentRunLoop.

En general, no es necesario acceder directamente al ciclo de ejecución, aunque hay algunos componentes (de red) que pueden permitirle especificar qué ciclo de ejecución utilizará para el procesamiento de E/S.

Un bucle de ejecución para un subproceso determinado esperará hasta que una o más de sus fuentes de entrada tengan datos o eventos, luego activará los manejadores de entrada apropiados para procesar cada fuente de entrada que esté "lista".

Después de hacerlo, volverá a su ciclo, procesando la entrada de varias fuentes y "durmiendo" si no hay trabajo que hacer.

Esa es una descripción de alto nivel (tratando de evitar demasiados detalles).

EDITAR

Un intento de abordar el comentario. Lo rompí en pedazos.

  • que significa que puedo único acceso/ejecución a otra dentro del bucle de hilo ¿verdad?

hecho. NSRunLoop no es seguro para subprocesos y solo se debe acceder desde el contexto del subproceso que ejecuta el ciclo.

  • ¿hay algún ejemplo sencillo de cómo agregar eventos a ejecutar en bucle?

Si desea supervisar un puerto, sólo habría que añadir puerto al bucle de ejecución, y luego el bucle de ejecución vigilaría ese puerto para la actividad.

- (void)addPort:(NSPort *)aPort forMode:(NSString *)mode 

También puede agregar un contador de tiempo de forma explícita con

- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode 
  • lo que significa que será luego regresar a su bucle?

El bucle de ejecución procesará todos los eventos listos cada iteración (de acuerdo con su modo).Tendrá que consultar la documentación para descubrir los modos de ejecución, ya que eso está un poco fuera del alcance de una respuesta general.

  • se ejecuta en bucle inactivo cuando inicio el hilo?

En la mayoría de las aplicaciones, el ciclo de ejecución principal se ejecutará automáticamente. Sin embargo, usted es responsable de iniciar el ciclo de ejecución y responder a los eventos entrantes para los hilos que gira.

  • es posible añadir algunos eventos para enhebrar bucle de ejecutar fuera del hilo?

no estoy seguro de lo que quiere decir aquí. No agrega eventos al ciclo de ejecución. Agrega fuentes de entrada y fuentes de temporizador (desde la secuencia que posee el ciclo de ejecución). El ciclo de ejecución luego los observa por actividad. Por supuesto, puede proporcionar datos de otros hilos y procesos, pero la entrada será procesada por el ciclo de ejecución que está monitoreando esas fuentes en el hilo que está ejecutando el ciclo de ejecución.

  • Qué significa que a veces puedo utilizar bucle de ejecución para bloquear hilo durante un tiempo

hecho. De hecho, un ciclo de ejecución se "mantendrá" en un controlador de eventos hasta que el controlador de eventos haya regresado. Puedes ver esto en cualquier aplicación lo suficiente. Instale un controlador para cualquier acción IO (por ejemplo, presionar un botón) que duerme. Bloqueará el ciclo de ejecución principal (y toda la UI) hasta que se complete ese método.

Lo mismo se aplica a cualquier ciclo de ejecución.

le sugiero que lea la siguiente documentación en los bucles de ejecución:

https://developer.apple.com/documentation/foundation/nsrunloop

y cómo se utiliza dentro de las discusiones:

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1

+1

significa que solo puedo acceder/ejecutar para ejecutar el bucle dentro del hilo ¿no? ¿Hay algún ejemplo simple de cómo agregar eventos para ejecutar bucle? ¿Qué significa que luego volverá a su ciclo? ¿El ciclo de ejecución está inactivo cuando comienzo el hilo? ¿es posible agregar algunos eventos al bucle de ejecución de subprocesos fuera del subproceso? ¿significa que a veces puedo usar ejecutar bucle para bloquear el hilo por un tiempo? – taffarel

+1

+1 Excelente, conciso y muy útil – Madbreaks

+0

"Instale un controlador para cualquier acción IO (por ejemplo, presionar un botón) que duerme". ¿Quiere decir que si continúo manteniendo mi dedo sobre el botón, continuará bloqueando el hilo por un tiempo? – Honey

6

Runloops son poco como una caja donde cosas simplemente suceden

Básicamente en Runloop, vas a procesar algunos eventos y luego regresas. O devuelve si no procesa ningún evento antes de que se agote el tiempo de espera. Puede decirlo de manera similar a las NSURLConnections asíncronas, Procesando datos en segundo plano sin interferir con su bucle actual y, al mismo tiempo, requiere datos de forma sincrónica. Que se puede hacer con la ayuda de Runloop que hace que mantenga su NSURLConnection asíncrona y proporcione datos en el momento de la llamada. Puede utilizar Runloop de la siguiente manera: -

NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1]; 
while (YourBoolFlag && [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:loopUntil]) 
loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1]; 

en este Runloop se ejecutará hasta el de completar algunos de sus otros trabajos y establecer YourBoolFlag a falsa.

De forma similar, puede usarlos en hilos.

Espero que esto te ayude.

1

bucles Run son lo que separa aplicaciones interactivas de comando de la línea herramientas.

  • Las herramientas de línea de comandos se inician con parámetros, ejecutan su comando y luego salen.
  • Aplicaciones interactivas espere para la entrada del usuario, reaccione, luego reanude la espera.

De here

Permiten que esperar hasta los grifos de usuario y responder en consecuencia, espera a que tengas un completionHandler y aplicar sus resultados, espera a que tengas un temporizador y realizar una función determinada. Si no tiene un runloop, entonces no puede escuchar/esperar los toques del usuario, no puede esperar hasta que se produzca una llamada de red, no puede despertarse en x minutos.

También desde this comment:

hilos de fondo no tienen sus propias runloops, pero se puede simplemente añadir uno. P.ej. AFNetworking 2.x lo hizo. Fue una técnica probada y verdadera para NSURLConnection o NSTimer en hilos de fondo, pero ya no hacemos esto , ya que las nuevas API eliminan la necesidad de hacerlo. Pero parece que URLSession hace, por ejemplo, here is simple request, corriendo [véase el panel izquierdo de la imagen] manipuladores de terminación en la cola principal, y se puede ver que tiene una carrera bucle en hilo de fondo