Sobes.tech
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.