Solución:
En términos simples, llego a la conclusión de que:
- Cola– Hay 3 tipos de cola, es decir, 1 cola principal, 4 cola global y cualquier número de colas personalizadas.
- Hilos– Uno es el hilo principal y otros hilos en segundo plano que nos proporciona el sistema.
DispatchQueue.main.async
-Significa realizar la tarea en la cola principal con el uso de subprocesos en segundo plano (sin bloqueo de la interfaz de usuario) y cuando la tarea finaliza, se actualiza automáticamente a la interfaz de usuario porque ya está en la cola principal.
DispatchQueue.global (). Async junto con global (). Sync
Significa realizar la tarea en la cola global con el uso de subprocesos en segundo plano y cuando la tarea finaliza, que sincronización global (). uso traer el trabajo de globalQueue a mainQueue que se actualizan a la interfaz de usuario.
Razón de la falla de mi aplicación
Estaba tratando de llevar la tarea completada a MainQueue usando (main.sync), pero ya estaba en MainQueue porque no había cambiado la cola, y esto crear DeadLock (MainQueue esperando por sí mismo), hace que mi aplicación se bloquee
En el primer caso, ejecuta el código en main
y luego usas main.sync
en el hilo principal. En esencia, está tratando de decirle al main
cola para esperar por sí misma, lo que obviamente es una tontería y, por lo tanto, causa un bloqueo.
En el segundo caso, ejecuta el código en el hilo de fondo y luego usa main.sync
esperar hasta que el main
hilo puede ejecutar el bloque proporcionado en main.sync
.
En general, usaría async
y no sync
todo el tiempo, a menos que sync
es necesario – y siempre sincronizar un hilo (DispatchQueue
) con uno diferente, nunca con el mismo.
GCD
Thread -> GCD -> Operation + OperationQueue(life cycle, dependencies between different queues, cancel)
Grand Central Dispatch
GCD
libdispatch
opera en colas de despacho DispatchQueue
con un pedido FIFO
DispatchQueue.<queue>.<sync/async>
significa ejecutar un <sync/async>
tarea en el <queue>
COLA
Por lo general, cuando hablamos de concurrent
hablamos de colas. GCD
tiene:
-
global queue
– compartido entre todo el sistema operativo iOS private queue
main
– cola global, cola en serie en un hilo principal que se utiliza para trabajando con UI
DispatchQueue.main
global()
– cola global, cola concurrente. Global
la cola tiene diferentes grupos con prioridades que pasa en la tarea usando qos
QoSClass
(Calidad de servicio) (priority
GlobalQueuePriority
es obsoleto):
-
userInteractive
– la mayor prioridad. Se puede utilizar para cálculos muy rápidos que se reflejan en la interfaz de usuario. Por ejemplo, cálculos de animación. -
userInitiated
– relevante para la interfaz de usuario. Varios segundos Por ejemplo cargando datos default
-
utility
– hasta varios minutos como datos de sincronización -
background
– hasta varias horas mientras la aplicación está en segundo plano
DispatchQueue.global()
DispatchQueue.global(qos: .background)
Cola personalizada: – cola privada, serial
o concurrent
cola personalizada
DispatchQueue(label: "serialQueue") // without attributes
DispatchQueue(label: "concurrentQueue", attributes: .concurrent)
sincronización / asincrónica
sync
– bloquear un hilo actual y esperar cuando termine en una cola especificada
async
– no bloquee un hilo actual y envíe un bloque de ejecución de código a la cola especificada
Error común: punto muerto
Si llamas DispatchQueue.main.sync
en un main
hilo: la aplicación se congelará porque la llamada DispatchQueue.main.sync
comienza a esperar inmediatamente cuando finaliza el bloque despachado (el bloque despachado no se inicia)
Algunas notas:
-
DispatchWorkItem
– retrasar / cancelar / priorizar una tarea dentroqueue
oDispatchGroup
-
DispatchGroup
si vas a ejecutar varios asincrónico tareas con una sola devolución de llamada -
Barrier
marca dentro de la cola simultánea en espera cuando todas las tareas ejecutadas están terminadas -> Tarea de barrera -> continuar ejecutando todas las demás tareas en la cola
[Sync vs Async]