2011-08-28 2 views
86

buena gente Estimados de stackoverflow,NSDefaultRunLoopMode vs NSRunLoopCommonModes

Al igual que la última vez, por este medio hacer que aparezca una pregunta poco me tropiezo con. Espero que alguien por ahí pueda arrojar algo de luz sobre mí.

Cada vez que intento descargar un archivo grande detrás de UIScrollView, MPMapView o algo así, el proceso de descarga se detiene tan pronto como toco la pantalla del iPhone. Afortunadamente, una impresionante publicación de blog por Jörn sugiere una opción alternativa, usando NSRunLoopCommonModes para la conexión.

Eso me pone miro en detalle de los dos modos, NSDefaultRunLoopMode y NSRunLoopCommonModes, pero el documento de manzana no amablemente explicar, que no sea diciendo

NSDefaultRunLoopMode

El modo de tratar con fuentes de entrada que NSConnection objetos. Este es el modo de ciclo de ejecución más comúnmente utilizado.

NSRunLoopCommonModes

objetos añadidos a un bucle de ejecución utilizando este valor como el modo son monitoreados por todos los modos de bucle de ejecución que han sido declarados como un miembro del conjunto de modos de “comunes"; ver el Descripción de CFRunLoopAddCommonMode para más detalles.

CFRunLoopAddCommonMode

Fuentes, temporizador s, y los observadores se registran en uno o más modos de ciclo de ejecución y solo se ejecutan cuando el ciclo de ejecución se ejecuta en uno de esos modos. Los modos comunes son un conjunto de modos de ciclo de ejecución para los que puede definir un conjunto de fuentes, temporizadores y observadores que comparten estos modos. En lugar de registrar una fuente, por ejemplo, para cada modo de ciclo de ejecución específico, puede registrarla una vez en el pseudo-modo común del ciclo de ejecución y se registrará automáticamente en cada modo de ciclo de ejecución en el conjunto de modos comunes. Del mismo modo, cuando se agrega un modo al conjunto de modos comunes, cualquier fuente, temporizador u observador ya registrado en el pseudo-modo común se agrega al modo común recién agregado.

¿Alguien puede explicar los dos en lenguaje humano?

Respuesta

164

Un ciclo de ejecución es un mecanismo que permite que el sistema active subprocesos para dormir para que puedan administrar eventos asincrónicos. Normalmente cuando ejecuta un hilo (a excepción del hilo principal) hay una opción para iniciar el hilo en un ciclo de ejecución o no. Si el subproceso ejecuta algún tipo de operación de larga duración sin interacción con eventos externos y sin temporizadores, no necesita un ciclo de ejecución, pero si su subproceso necesita responder a eventos entrantes, debe adjuntarse a un ciclo de ejecución para Despertar el hilo cuando lleguen nuevos eventos. Este es el caso de NSURLConnection subprocesos generados, ya que solo se activan en los eventos entrantes (desde la red).

Cada subproceso se puede asociar a varios bucles de ejecución o se puede asociar a un bucle de ejecución específico que se puede configurar para que funcione en diferentes modos. Un "modo de ciclo de ejecución" es una convención utilizada por el sistema operativo para establecer algunas reglas sobre cuándo entregar ciertos eventos o recopilarlos para entregarlos más tarde.

Por lo general, todos los bucles de ejecución están configurados en el "modo predeterminado" que establece una forma predeterminada de administrar los eventos de entrada.Por ejemplo: tan pronto como ocurre un evento de arrastrar ratón (Mac OS) o táctil (en iOS), el modo para este ciclo de ejecución se establece en seguimiento de eventos; esto significa que el hilo no se activará en nuevos eventos de red, pero estos eventos se enviarán más tarde cuando el evento de entrada del usuario finalice y el bucle de ejecución vuelva a establecerse en modo predeterminado; obviamente, esta es una elección hecha por los arquitectos del sistema operativo para dar prioridad a los eventos del usuario en lugar de eventos de fondo.

Si decide cambiar el modo de bucle de ejecución para su NSURLConnection hilo, mediante el uso de scheduleInRunLoop:forModes:, a continuación, puede asignar el hilo a un lazo especial, de gestión modo, en lugar del bucle específica de ejecución predeterminado. El pseudo-modo especial llamado NSRunLoopCommonModes es utilizado por muchas fuentes de entrada, incluido el seguimiento de eventos. Por ejemplo, asignar la instancia de NSURLConnection al modo común significa que asocia sus eventos al "modo de seguimiento" además del "modo predeterminado". Una ventaja/desventaja de asociar hilos con NSRunLoopCommonModes es que el hilo no será bloqueado por eventos táctiles.

Se pueden agregar modos nuevos a los modos comunes, pero esta es una operación de bajo nivel.

me gustaría cerrar mediante la adición de unas pocas notas:

  • Normalmente tenemos que utilizar un conjunto de imágenes o miniaturas descargados de la red con una vista de tabla. Podemos pensar que descargando estas imágenes de la red mientras que la vista de tabla es puede mejorar la experiencia del usuario (ya que pudimos ver las imágenes mientras se desplaza ), pero esto no es ventajoso ya que la fluidez del desplazamiento puede sufrir mucho. En este ejemplo con NSURLConnection, no se debe usar un ciclo de ejecución; sería mejor utilizar los métodos delegados UIScrollView para detectar cuándo finaliza el desplazamiento y luego actualizar la tabla y descargar nuevos elementos de la red;

  • Puede considerar el uso de GCD que lo ayudará a "proteger" su código de los problemas de administración del bucle de ejecución. En el ejemplo anterior, puede considerar agregar sus solicitudes de red a una cola serial personalizada.

+6

Estimado Viggio24, muchas gracias por esta explicación clara y precisa. Le pediría a Apple que incluyera su comentario en su guía API. ;) – Stkim1

+0

He votado por su respuesta porque es absolutamente clara. Gracias por compartir su conocimiento. –

+3

** La respuesta de viggio24 ** es perfecta. Para los interesados, señalaré que ** La sesión 208 (aplicaciones de red para iPhone OS, parte 2) ** de WWDC 2010 contiene una introducción sobre los bucles de ejecución. Si está interesado, eche un vistazo. Espero eso ayude. –

Cuestiones relacionadas