Middle
¿Qué es un grupo de despacho en el contexto del desarrollo de iOS?
sobes.tech AI
Respuesta de la IA
DispatchGroup — es un mecanismo de GCD (Grand Central Dispatch) que permite rastrear la finalización de un grupo de tareas asíncronas y realizar una acción después de su finalización. Es útil cuando se necesita coordinar el trabajo de varias colas de despacho o hilos.
Métodos principales:
enter(): Informa al grupo que una tarea ha comenzado. Aumenta el contador interno del grupo.leave(): Informa al grupo que una tarea ha finalizado. Disminuye el contador.wait(): Bloquea el hilo actual hasta que el contador del grupo sea cero o hasta que expire el tiempo de espera.notify(queue:execute:): Registra un bloque de código que se ejecutará de forma asíncrona en la cola especificada cuando el contador del grupo sea cero.
Ejemplo de uso de notify:
import Foundation
let group = DispatchGroup()
let queue = DispatchQueue.global(qos: .userInitiated)
queue.async(group: group) {
// Primera tarea asíncrona
print("Tarea 1 en ejecución...")
Thread.sleep(forTimeInterval: 1)
print("Tarea 1 finalizada.")
}
queue.async(group: group) {
// Segunda tarea asíncrona
print("Tarea 2 en ejecución...")
Thread.sleep(forTimeInterval: 2)
print("Tarea 2 finalizada.")
}
// Ejecutar este bloque después de que todas las tareas en el grupo hayan finalizado
group.notify(queue: .main) {
print("Todas las tareas en el grupo han finalizado.")
}
// Para demostración de naturaleza no bloqueante con notify
print("Código después de agregar tareas")
Ejemplo alternativo con enter() y leave() manual:
import Foundation
let group = DispatchGroup()
let queue = DispatchQueue.global(qos: .userInitiated)
group.enter() // La tarea 1 comenzó
queue.async {
print("Tarea 1 en ejecución...")
Thread.sleep(forTimeInterval: 1)
print("Tarea 1 finalizada.")
group.leave() // La tarea 1 finalizó
}
group.enter() // La tarea 2 comenzó
queue.async {
print("Tarea 2 en ejecución...")
Thread.sleep(forTimeInterval: 2)
print("Tarea 2 finalizada.")
group.leave() // La tarea 2 finalizó
}
group.notify(queue: .main) {
print("Todas las tareas en el grupo han finalizado con notify.")
}
// Ejemplo de uso de wait (bloqueante)
// group.wait()
// print("Todas las tareas han finalizado con wait.") // Este código se ejecutará después de que todas las tareas finalicen, bloqueando el hilo actual.