Querida gente buena de stackoverflow,

Al igual que la última vez, yo por la presente traer una pregunta hace poco me tropezar. Espero que alguien por ahí podría arrojar algo de luz sobre mí.

Cada vez que intento descargar un archivo de gran tamaño detrás de UIScrollView, MPMapView o algo, la descarga del proceso se detuvo tan pronto como me toque la pantalla del iPhone. Afortunadamente, una impresionante entrada de blog por Jörn sugiere una opción alternativa, el uso de NSRunLoopCommonModes para la conexión.

Que me pone la mirada en el detalle de los dos modos, NSDefaultRunLoopMode y NSRunLoopCommonModes, pero el documento de apple no por favor, explícame, otros diciendo que

NSDefaultRunLoopMode

El modo de lidiar con el aporte de otras fuentes de NSConnection objetos.
Este es el más comúnmente utilizado ejecutar en modo de bucle.

NSRunLoopCommonModes

Agregar objetos a una ejecución del bucle utilizando este valor como el modo en el que son monitoreados por ejecutan todos los modos de bucle que han sido declaradas como un miembro de la serie de los «comunes» de los modos, consulte la descripción de CFRunLoopAddCommonMode para más detalles.

CFRunLoopAddCommonMode

Fuentes, temporizadores, y los observadores registrados a uno o más modos de bucle y sólo se ejecuta cuando el bucle se ejecuta en uno de esos modos. Modos comunes son un conjunto de modos de bucle para el que puede definir un conjunto de fuentes, temporizadores, y de los observadores que son compartidos por estos modos. En lugar de registrar una fuente, por ejemplo, para cada caso concreto de ejecutar en modo de bucle, se puede registrar una vez a la ejecución del bucle común pseudo-modo y será registrado automáticamente en cada ejecución del bucle en modo común modo de juego. Del mismo modo, cuando un modo de añadido para el conjunto de los modos, de cualquier fuente, temporizadores, o los observadores ya están registrados para el común de la pseudo-modo de añadido el añadido recientemente de modo común.

¿Alguien puede por favor explicar los dos en el lenguaje humano?

InformationsquelleAutor Stkim1 | 2011-08-28

1 Comentario

  1. 187

    Ejecutar un bucle es un mecanismo que permite que el sistema de despertador dormir hilos para que puedan gestionar eventos asíncronos. Normalmente cuando se ejecuta un hilo (con la excepción de que el hilo principal) hay una opción para iniciar el hilo en un bucle o no. Si el hilo se ejecuta algún tipo o de larga duración de la operación sin la interacción con los eventos externos y sin temporizadores, usted no necesita ejecutar un bucle, pero si sus necesidades de hilo para responder a los eventos entrantes, debe ser conectado a una ejecución del bucle con el fin de despertar el hilo nuevo cuando llegan los eventos. Este es el caso de NSURLConnection generado hilos, ya que sólo despertar en los eventos de entrada (de la red).

    Cada hilo puede estar asociada a múltiples ejecutar bucles, o puede estar asociada a una ejecución específica de bucle que puede ser configurado para trabajar en diferentes modos. Una «ejecutar en modo de bucle» es una convención utilizada por el sistema operativo para establecer algunas reglas para entregar ciertos eventos o recopilar para ser entregado después.

    Generalmente se ejecuten todos los bucles se establece en el «modo por defecto», que establece un método por defecto para gestionar los eventos de entrada. Por ejemplo: tan pronto como un ratón arrastre (Mac OS) o táctil (en iOS) evento que sucede a continuación, el modo de ejecutar este bucle se establece para el seguimiento de eventos; esto significa que el hilo no se despierta en los nuevos eventos de la red, pero estos eventos serán entregados más tarde, cuando el usuario de eventos de entrada y termina la ejecución del bucle para establecer el modo por defecto de nuevo; obviamente esto es una elección hecha por el sistema operativo de los arquitectos para dar prioridad a los eventos de usuario en lugar de los eventos de fondo.

    Si usted decide cambiar al ejecutar el modo de lazo para su NSURLConnection hilo, mediante el uso de scheduleInRunLoop:forModes:, a continuación, puede asignar el hilo a un especial de ejecutar el bucle el modo de, en lugar de la predeterminada específica de ejecutar el bucle. El especial pseudo-modo llamado NSRunLoopCommonModes es utilizado por muchas fuentes de entrada, incluyendo el seguimiento de eventos. Por ejemplo, la asignación de NSURLConnection‘s ejemplo para el modo común de medios asociados a sus eventos, a «modo de seguimiento», además del «modo por defecto». Una de las ventajas/desventajas de la asociación de hilos con NSRunLoopCommonModes es que el hilo no será bloqueado por eventos de toque.

    Nueva modos puede ser añadido a los modos comunes, pero esta es muy baja, a nivel de operación.

    Me gustaría cerrar mediante la adición de un par de notas:

    • Normalmente es necesario utilizar un conjunto de imágenes o
      miniaturas descargado desde la red con una vista de tabla. Podemos pensar que
      descargar estas imágenes de la red, mientras que la vista de la tabla es
      desplazamiento podría mejorar la experiencia del usuario (ya pudimos ver las imágenes mientras
      el desplazamiento), pero esto no es ventajoso ya que la fluidez de
      el desplazamiento puede sufrir mucho. En este ejemplo con NSURLConnection ejecutar un bucle no debe ser utilizado, ya que sería mejor utilizar el UIScrollView delegado métodos para detectar cuando el desplazamiento es terminado y, a continuación, actualizar la tabla y descargar nuevos elementos
      desde la red;

    • Usted puede considerar el uso de MCD que le ayudará a «escudo» de su código
      de ejecutar el bucle de gestión de problemas. En el ejemplo anterior, usted puede
      considere la posibilidad de agregar sus solicitudes de red a una costumbre de serie de la cola.

    • Queridos Viggio24, muchas gracias por esta limpia, precisa explicación. Me gustaría pedir a Apple de incluir su comentario a su guía de API. 😉
    • Yo upvoted tu respuesta porque es absolutamente claro!! Gracias por compartir tus conocimientos.
    • viggio24‘s respuesta es perfecta. Para aquellos interesados en el, me gustaría señalar que la Sesión 208 (Red de Apps para iPhone OS, Parte 2) de la WWDC 2010 contiene una introducción en ejecución de los bucles. Si te interesa echar un vistazo. Espero que ayude.
    • Sólo una nota para mí mismo: NSRunLoopCommonModes permite evento de temporizador mientras que el desplazamiento en UIScrollView. NSDefaultRunLoopMode prevenir el temporizador durante el desplazamiento.
    • Me pareció muy interesante el comentario sobre el desplazamiento actualización de la vista, como lo menciona un tema difícil. Sólo para agregar más detalles sobre esto: Cuando se establece un modo para un NSURLConnection, esto sólo afecta a la ejecución de la llamada a delegado-backs. Entiendo que la actualización del scrollView aquí podría resultar en un problema de rendimiento, pero ¿por qué está sucediendo esto? Si la respuesta es que la foto tiene que ser cargado en la memoria, puede hacerlo por escrito en un gráfico contexto en el fondo, y la actualización de su vista el hilo principal de la capa después de hacer esto. ¿es esto razonable?

Dejar respuesta

Please enter your comment!
Please enter your name here