Lição: 51: Fundamentos do Grand Central Dispatch (GCD)
Nesta aula, vamos explorar o Grand Central Dispatch (GCD), uma tecnologia poderosa fornecida pela Apple para gerenciar tarefas concorrentes em Swift. O GCD permite executar várias tarefas simultaneamente ou em uma ordem específica, facilitando a melhoria da responsividade e do desempenho do aplicativo.
O que é o GCD?
O Grand Central Dispatch é uma API de baixo nível para gerenciar operações concorrentes em iOS, macOS, watchOS e tvOS. Ele fornece um mecanismo simples para executar código de forma assíncrona em diferentes threads, sem a necessidade de gerenciar as threads diretamente. O GCD gerencia um pool de threads e filas para você, permitindo uma execução eficiente das tarefas.
Filas de Despacho
O GCD utiliza filas de despacho para gerenciar a execução das tarefas. Existem dois tipos principais de filas de despacho:
- Filas Seriais: Executam uma tarefa por vez na ordem em que são adicionadas.
- Filas Concorrentes: Permitem que várias tarefas sejam executadas ao mesmo tempo.
Fila Principal
A fila principal é uma fila serial que roda na thread principal. É utilizada para atualizações de interface e deve sempre ser executada rapidamente para garantir uma interface responsiva.
Filas Globais
As filas globais são filas concorrentes que podem ser usadas para tarefas em segundo plano. Elas oferecem diferentes níveis de qualidade de serviço (QoS), permitindo que o sistema priorize tarefas com base nas necessidades do usuário (por exemplo, interativa, iniciada pelo usuário, padrão, utilitário, em segundo plano).
Criando uma Fila Serial
Veja como criar e usar uma fila serial em Swift:
let filaSerial = DispatchQueue(label: "com.exemplo.filaSerial")
filaSerial.async {
print("Tarefa 1 iniciada")
sleep(2) // Simulando uma tarefa demorada
print("Tarefa 1 concluída")
}
filaSerial.async {
print("Tarefa 2 iniciada")
sleep(1)
print("Tarefa 2 concluída")
}
Neste exemplo, "Tarefa 1" será concluída antes que "Tarefa 2" comece, pois estamos usando uma fila serial.
Criando uma Fila Concorrente
Aqui está um exemplo de uma fila concorrente:
let filaConcorrente = DispatchQueue(label: "com.exemplo.filaConcorrente", attributes: .concurrent)
filaConcorrente.async {
print("Tarefa 1 iniciada")
sleep(2) // Simulando uma tarefa demorada
print("Tarefa 1 concluída")
}
filaConcorrente.async {
print("Tarefa 2 iniciada")
sleep(1)
print("Tarefa 2 concluída")
}
Neste caso, "Tarefa 1" e "Tarefa 2" podem começar simultaneamente, e a ordem de conclusão pode variar.
Gerenciando Tarefas com QoS
Você pode especificar a qualidade de serviço para uma tarefa para indicar sua importância:
let filaEmSegundoPlano = DispatchQueue.global(qos: .background)
filaEmSegundoPlano.async {
print("Tarefa em segundo plano iniciada")
sleep(2)
print("Tarefa em segundo plano concluída")
}
let filaIniciadaPeloUsuario = DispatchQueue.global(qos: .userInitiated)
filaIniciadaPeloUsuario.async {
print("Tarefa iniciada pelo usuário iniciada")
sleep(1)
print("Tarefa iniciada pelo usuário concluída")
}
Grupos de Despacho
Às vezes, você pode querer monitorar a conclusão de várias tarefas. Os grupos de despacho permitem agrupar várias tarefas e receber uma notificação quando todas estiverem finalizadas.
let grupoDespacho = DispatchGroup()
grupoDespacho.enter()
filaSerial.async {
print("Tarefa 1 iniciada")
sleep(2)
print("Tarefa 1 concluída")
grupoDespacho.leave()
}
grupoDespacho.enter()
filaSerial.async {
print("Tarefa 2 iniciada")
sleep(1)
print("Tarefa 2 concluída")
grupoDespacho.leave()
}
grupoDespacho.notify(queue: DispatchQueue.main) {
print("Todas as tarefas foram concluídas.")
}
Neste exemplo, a fila principal irá imprimir "Todas as tarefas foram concluídas." somente após "Tarefa 1" e "Tarefa 2" estarem ambas finalizadas.
Conclusão
O Grand Central Dispatch (GCD) é uma ferramenta poderosa para gerenciar concorrência em suas aplicações Swift. Ao compreender os diferentes tipos de filas de despacho, níveis de qualidade de serviço e ao usar grupos de despacho, você pode construir aplicações responsivas e eficientes. Experimentar com o GCD pode melhorar significativamente o desempenho do seu aplicativo, especialmente ao lidar com tarefas que demandam bastante tempo. Boa programação!