ios - lenguaje - the swift programming language pdf
Es DispatchQueue.global(qos:.userInteractive).async igual que DispatchQueue.main.async (5)
Estaba revisando el tutorial: https://www.raywenderlich.com/148513/grand-central-dispatch-tutorial-swift-3-part-1
Y se encontró con la definición de clase QoS interactiva por el usuario . Se menciona allí que esto debería ejecutarse en el hilo principal. Entonces, mi pregunta es ¿cuál es la diferencia entre la
DispatchQueue.global(qos: .userInteractive).async{}
y
DispatchQueue.main.async{}
¡¡Gracias!!
Cualquiera que diga que la cola global .userInitiated
es el hilo principal está simplemente equivocada. Es una cola de fondo de muy alta prioridad, pero es una cola de fondo (y es concurrente, a diferencia del hilo principal).
El código de muestra y los comentarios de Apple dejan el asunto bastante claro:
// This handler gets called on the main thread; dispatch to a background queue for processing.
DispatchQueue.global(qos: .userInitiated).async {
Esto demuestra, más allá de la sombra de la duda, que Apple cree que la cola global .userInitiated
el .userInitiated
es una "cola de fondo" y no el "hilo principal".
Estos no son lo mismo. Significan cosas diferentes y debes usar la que quieres decir. La cola principal es userInteractive, pero no todas las colas de UserInteractive es la cola principal. Esto es discutido bien por Apple en la creación de aplicaciones responsivas y eficientes con GCD .
Es válido tener varias colas ejecutándose en el nivel de UserInteractive. Esto es apropiado si necesita hacer uso de múltiples núcleos simultáneamente para realizar los cálculos que se requieren para mantener una interacción fluida del usuario (generalmente algún tipo de animación). Esto es muy raro de necesitar, y debe hacerse con cuidado, pero si necesita calcular algo en el hilo principal al mismo tiempo que calcula algo en otro núcleo para mantenerse al día con las acciones de los usuarios, para eso está ahí.
Pero solo puede haber una cola principal. Sucede que es UserInteractive, pero ese no es su punto. La mayoría de UIKit no es seguro para subprocesos y solo es válido para acceder a esas clases en la cola principal, no a cualquier cola interactiva de usuario.
Las prioridades de la cola son más complejas ya que aparecen al principio. Pueden propagarse de una cola a otra, de modo que las colas de "baja prioridad" pueden tener temporalmente un estado de alta prioridad. Apple ajusta cómo esto funciona mucho para hacer que todo el sistema sea más sensible. Por eso es tan importante expresar siempre lo que quiere decir en lugar de confiar en suposiciones acerca de cómo podrían funcionar las cosas bajo la cobertura. Incluso si sus pruebas le muestran que dos colas son siempre las mismas, eso no sería suficiente para saber que serán las mismas en todos los dispositivos o para futuras versiones del sistema operativo.
La cola principal se ejecuta en el hilo principal como usted dice.
Las colas globales son colas concurrentes y desde la página principal para dispatch_get_global_queue:
A diferencia de la cola principal o las colas asignadas con dispatch_queue_create (), la programación de colas simultáneas globales se bloquea tan pronto como los subprocesos están disponibles (orden de finalización "no FIFO"). Las colas simultáneas globales representan tres bandas de prioridad:
• DISPATCH_QUEUE_PRIORITY_HIGH
• DISPATCH_QUEUE_PRIORITY_DEFAULT
• DISPATCH_QUEUE_PRIORITY_LOW
Los bloques enviados a la cola global de alta prioridad se invocarán antes de los enviados a las colas globales predeterminadas o de baja prioridad. Los bloques enviados a la cola global de baja prioridad solo se invocarán si no hay bloques pendientes en las colas predeterminadas o de alta prioridad.
Por lo tanto, son colas que se ejecutan en subprocesos en segundo plano a medida que están disponibles. Son "no FIFO", por lo que no se garantiza el pedido.
Las definiciones de "calidad de servicio" se describen aquí:
Parece que el hilo "principal" tendrá una clase de QoS de "Usuario interactivo". Sin embargo, solo porque un subproceso se crea con una QoS de "Usuario interactivo", no significa que sea el subproceso "principal".
Puedes observar esto en el depurador de Xcode. Coloque un punto de interrupción dentro del bloque asíncrono y observe el panel de subprocesos activos de Debug Navigator. Cuando se DispatchQueue.global(qos: .userInteractive).async{}
desde el hilo principal, se muestra con un nombre diferente al del hilo principal.
En general, el hilo principal se considera el hilo especial donde se debe realizar todo el acceso relacionado con la vista. Si algo consume un tiempo significativo, por ejemplo, llamar a un servicio web, comprimir un archivo, etc., querrá ejecutar el código en una cola separada y, cuando finalice el proceso, vuelva a la cola principal donde actualiza la interfaz de usuario.
Tenga en cuenta también que cuando use Xcode 9 con iOS 11, se emitirá una advertencia cuando se acceda a un objeto de interfaz de usuario desde un subproceso no principal.
Puede usar DispatchQueue.global(qos: .userInteractive).async{}
cuando quiera hacer algo muy rápido en segundo plano mientras el usuario interactúa con su aplicación. Rara vez se usa porque, como tiene que suceder tan rápido, probablemente puede hacerlo directamente en la cola principal.
Puede consultar esta lecture en la que se explica claramente este tema.