Sobes.tech
Middle

O que é um grupo de despacho no contexto do desenvolvimento iOS?

sobes.tech IA

Resposta da IA

DispatchGroup — é um mecanismo do GCD (Grand Central Dispatch) que permite acompanhar a conclusão de um grupo de tarefas assíncronas e executar uma ação após sua finalização. É útil quando é necessário coordenar o trabalho de várias filas de despacho ou threads.

Métodos principais:

  • enter(): Informa ao grupo que uma tarefa começou. Aumenta o contador interno do grupo.
  • leave(): Informa ao grupo que uma tarefa terminou. Diminui o contador.
  • wait(): Bloqueia o thread atual até que o contador do grupo seja zero ou até que o tempo limite expire.
  • notify(queue:execute:): Registra um bloco de código que será executado de forma assíncrona na fila especificada quando o contador do grupo for zero.

Exemplo de uso de notify:

import Foundation

let group = DispatchGroup()
let queue = DispatchQueue.global(qos: .userInitiated)

queue.async(group: group) {
    // Primeira tarefa assíncrona
    print("Tarefa 1 em execução...")
    Thread.sleep(forTimeInterval: 1)
    print("Tarefa 1 finalizada.")
}

queue.async(group: group) {
    // Segunda tarefa assíncrona
    print("Tarefa 2 em execução...")
    Thread.sleep(forTimeInterval: 2)
    print("Tarefa 2 finalizada.")
}

// Executar este bloco após todas as tarefas do grupo serem concluídas
group.notify(queue: .main) {
    print("Todas as tarefas do grupo foram concluídas.")
}

// Para demonstração de natureza não bloqueante com notify
print("Código após adicionar tarefas")

Exemplo alternativo com enter() e leave() manual:

import Foundation

let group = DispatchGroup()
let queue = DispatchQueue.global(qos: .userInitiated)

group.enter() // Tarefa 1 começou
queue.async {
    print("Tarefa 1 em execução...")
    Thread.sleep(forTimeInterval: 1)
    print("Tarefa 1 finalizada.")
    group.leave() // Tarefa 1 finalizada
}

group.enter() // Tarefa 2 começou
queue.async {
    print("Tarefa 2 em execução...")
    Thread.sleep(forTimeInterval: 2)
    print("Tarefa 2 finalizada.")
    group.leave() // Tarefa 2 finalizada
}

group.notify(queue: .main) {
    print("Todas as tarefas do grupo foram concluídas com notify.")
}

// Exemplo de uso de wait (bloqueante)
// group.wait()
// print("Todas as tarefas concluídas com wait.") // Este código será executado após a conclusão de todas as tarefas, bloqueando o thread atual.