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