¿Qué métodos existen para colocar tareas en la cola de Grand Central Dispatch (GCD)?
sobes.tech AI
Respuesta de la IA
Existen las siguientes formas de colocar tareas en la cola GCD:
-
Ejecución asíncrona (async): La tarea se añade a la cola y la ejecución continúa inmediatamente en el hilo actual, sin esperar a que la tarea en la cola termine.
DispatchQueue.global().async { // Código de la tarea } -
Ejecución síncrona (sync): La tarea se añade a la cola y el hilo actual se bloquea hasta que la tarea en la cola finalice. Evite usar sync en el hilo principal para tareas de larga duración para no bloquear la interfaz de usuario.
DispatchQueue.global().sync { // Código de la tarea, el hilo actual esperará } -
Ejecución diferida (asyncAfter): La tarea se añade a la cola con un retraso especificado. La ejecución comenzará no antes del tiempo indicado.
DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) { // El código de la tarea se ejecutará en 2 segundos } -
Ejecución en grupo (DispatchGroup): Las tareas pueden añadirse a un DispatchGroup para sincronizar su finalización. Se puede esperar a que todas terminen o ser notificado (notify) después de su finalización.
let group = DispatchGroup() group.enter() DispatchQueue.global().async { // Tarea 1 group.leave() } group.enter() DispatchQueue.global().async { // Tarea 2 group.leave() } group.notify(queue: .main) { // Todas las tareas en el grupo han finalizado } -
Ejecución de iteraciones (concurrentPerform): Permite ejecutar un bloque de código
iterationsveces en paralelo en una cola concurrente.DispatchQueue.concurrentPerform(iterations: 100) { index in // Código que se ejecuta para cada índice en paralelo } -
DispatchWorkItem: Envuelve un bloque de código y permite cancelar la tarea antes de que comience o después de haber sido añadida a la cola, si aún no ha empezado.
var workItem: DispatchWorkItem? workItem = DispatchWorkItem { // Código de la tarea } DispatchQueue.global().async(execute: workItem!) // Se puede cancelar la tarea si aún no ha comenzado // workItem?.cancel()