Saltar al contenido

main.async vs main.sync () vs global (). async en Swift3 GCD

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

maincola 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 dentro queue o DispatchGroup
  • 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]

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *