Grupo de subprocesss: DispatchQueue.main.async

Había trabajado en Java, y estaba bastante claro con el trabajo de subprocesss y grupo de subprocesss.

Me preguntaba si alguien puede explicar el funcionamiento de cómo se crean los hilos y se asigna espacio en el grupo de hilos de manera rápida.

Tambien

Dispatch.main.async { // some code } 

Crea un nuevo subprocess o ejecuta asincrónicamente la tarea?

Gracias de antemano =)

Las queues y los hilos son conceptos separados. Las queues se orderan (a veces se priorizan) secuencias de bloques para ejecutar. Como (en su mayoría) un detalle de implementación, los bloques deben progtwigrse en subprocesss para ejecutarse, pero este no es el punto principal de ellos.

Entonces, Dispatch.main.async distribuye (agrega) un bloque a la queue principal. La queue principal es serial y algo especial en que se promete que también se ejecutará exclusivamente en el hilo principal (como lo señaló Paulw11). También promete estar asociado con el runloop principal. Entender este concepto de "agregar un bloque a una queue" es crítico, ya que tiene un impacto significativo en la forma en que diseña las cosas en las queues frente a cómo diseña las cosas en los hilos. async no significa "comenzar a ejecutar esto ahora". Significa "pegar esto en una queue, pero no esperes".

Como un buen ejemplo de cómo los layouts pueden ser diferentes, colocar algo en una queue no significa que nunca se ejecutará (incluso sin errores o interlockings). Es posible y útil suspender las queues para que detenga la progtwigción de bloques. Es posible vincular queues a otras queues, de modo que cuando una queue "progtwig" algo, simplemente lo coloca en otra queue en lugar de ejecutarlo. Hay muchas cosas que puede hacer con queues no relacionadas con "ejecutar cosas en segundo plano". Puede adjuntar controlleres de finalización a bloques. Puede usar grupos para esperar en collections de bloques. GCD es una forma de pensar sobre la concurrency. El paralelismo es solo un beneficio secundario. (Una gran discusión sobre este concepto es Concurrencia no es paralelismo por Rob Pike . Está en Go, pero los conceptos siguen vigentes).

Si llama a Dispatch.main.async mientras se ejecuta en la queue principal, ese bloque está absolutamente seguro de que no se ejecutará hasta que el bloque actual termine. En UIKit y AppKit, "el bloque actual termina" a menudo significa "regresas de un método que fue llamado por el sistema operativo". Si bien no está implementado de esta manera, puede pretender que cada vez que se le llama desde el sistema operativo, se envuelve en una llamada a Dispatch.main.async .

También es por eso que nunca debe llamar a Dispatch.main.sync (nota de sync ) desde la queue principal. Ese bloque esperará a que regrese, y esperará hasta que el bloque termine. Un estancamiento clásico.

Como regla, el grupo de subprocesss no es su negocio en iOS. Es un detalle de implementación. Ocasionalmente, debe pensar en ello por razones de performance, pero si está pensando demasiado en ello, probablemente esté diseñando su concurrency incorrectamente.

Si vienes de Java, definitivamente quieres leer Migración lejos de los hilos en la Guía de progtwigción de concurrency. Es el recurso definitivo sobre cómo repensar los patrones basados ​​en subprocesss en las queues.

Su código pone en queue el bloque de código en la queue principal ( Dispatch.main ) y regresa inmediatamente ( .async ), antes de ejecutar el código.

No tiene control sobre qué hilo utiliza la queue. Incluso si crea una queue propia:

 let serialQueue = DispatchQueue(label: "queuename") serialQueue.async { ... } 

usted no sabe en qué subprocess se ejecutará su código.


Actualizar:

Como lo indicó correctamente Paulw11 en el comentario,

… si envía una tarea en la queue principal, se garantiza que se ejecutará en el hilo principal. Si envía una tarea en cualquier otra queue, no sabe qué subprocess se ejecutará; puede ejecutarse en el hilo principal o en algún otro hilo.