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.