Sobes.tech
Middle

¿Qué herramientas están disponibles en Grand Central Dispatch (GCD)?

sobes.tech AI

Respuesta de la IA

Herramientas principales de GCD:

  • Colas de despacho (Dispatch Queues): Gestionan la ejecución de bloques de código. Pueden ser:
    • Secuenciales (Serial): Ejecutan tareas una por una, garantizando el orden.
    • Paralelas (Concurrent): Ejecutan tareas simultáneamente (dentro de los recursos del sistema disponibles).
  • Colas paralelas globales (Global Concurrent Queues): Proporcionadas por el sistema, tienen prioridades predefinidas (clases de calidad de servicio - QoS).
  • Cola principal (Main Queue): Una cola secuencial especial vinculada al hilo principal de la aplicación. Se usa para trabajar con la interfaz de usuario.
  • Grupos de despacho (Dispatch Groups): Permiten rastrear la finalización de un conjunto de tareas asíncronas.
  • Semántica de barreras (Barrier Semantics): Para colas paralelas, permite crear una "barrera" después de la cual solo se ejecutan tareas colocadas después de la barrera, hasta que esta sea superada.
  • Fuentes de despacho (Dispatch Sources): Permiten responder a eventos del sistema (operaciones de archivos, señales, temporizadores, etc.).
  • DispatchWorkItem: Envuelve un bloque de código y puede ser enviado a una cola, cancelado y notificado al finalizar.

Ejemplo de creación de una cola secuencial y ejecución de una tarea:

let serialQueue = DispatchQueue(label: "com.example.serialQueue")

serialQueue.async {
    // Se ejecuta de forma asíncrona en la cola secuencial
    print("Tarea ejecutada en la cola secuencial")
}

Ejemplo de uso de un grupo de despacho:

let group = DispatchGroup()
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

group.enter() // Entrar en el grupo
concurrentQueue.async {
    // Tarea 1
    print("Tarea 1 finalizada")
    group.leave() // Salir del grupo
}

group.enter() // Entrar en el grupo
concurrentQueue.async {
    // Tarea 2
    print("Tarea 2 finalizada")
    group.leave() // Salir del grupo
}

group.notify(queue: .main) {
    // Se ejecuta después de que todas las tareas en el grupo hayan finalizado
    print("Todas las tareas en el grupo han finalizado")
}

Ejemplo de uso de DispatchWorkItem:

let workItem = DispatchWorkItem {
    print("WorkItem ejecutado")
}

DispatchQueue.global().async(execute: workItem)

// workItem.cancel() // Se puede cancelar antes de que se ejecute