O que é GCD (Grand Central Dispatch) e como é utilizado no desenvolvimento iOS?
sobes.tech IA
Resposta da IA
GCD (Grand Central Dispatch) é uma tecnologia de baixo nível da Apple para paralelismo, baseada em C, mas com wrappers convenientes em Swift e Objective-C. Ela fornece um mecanismo para gerir filas de tarefas (work items) e a sua execução assíncrona ou síncrona nos núcleos de processador disponíveis.
Conceitos principais do GCD:
-
Queues de Dispatch: Filas para executar tarefas. Existem dois tipos:
- Queues Sériais: As tarefas são executadas sequencialmente, uma após a outra. Evitam condições de corrida ao aceder a recursos partilhados.
- Queues Concorrentes: As tarefas são executadas em paralelo (mas a ordem de início e fim não é garantida). Usadas para tarefas independentes que podem correr simultaneamente.
- Queue Principal: Uma fila sequencial especial ligada ao thread principal da aplicação. Usada para atualizar a UI. Todas as tarefas relacionadas com a UI devem ser executadas nesta fila.
-
Work Items (Closures/Blocks): Blocos de código que representam uma tarefa a executar.
-
Grupo de Dispatch: Permite agrupar tarefas e receber notificação quando todas terminarem.
-
Semáforos de Dispatch: Primitive de sincronização para gerir o acesso a recursos limitados.
Uso em desenvolvimento iOS:
-
Executar operações pesadas em background: Mover tarefas como pedidos de rede, processamento de imagens, trabalho com bases de dados, da fila principal para filas em background (por exemplo, filas globais concorrentes) para evitar bloquear a UI.
// Executar tarefa assíncrona numa fila paralela global DispatchQueue.global(qos: .userInitiated).async { // Operação pesada let result = performHeavyOperation() // Atualizar UI no thread principal DispatchQueue.main.sync { updateUI(with: result) } } -
Atualizar a UI: Sempre realizar operações de alteração da interface de utilizador na fila principal.
// Atualizar UI no thread principal DispatchQueue.main.async { self.label.text = "Atualizado!" } -
Serializar acesso a dados: Uso de filas seriais personalizadas para acesso sincronizado a recursos partilhados modificáveis.
// Exemplo de fila serial para acesso sincronizado let dataAccessQueue = DispatchQueue(label: "com.myapp.dataaccess") func updateSharedData(newValue: Int) { dataAccessQueue.async { // Alterar dados partilhados de forma segura sharedData = newValue } } -
Agrupamento de tarefas: Aguardar a conclusão de várias tarefas assíncronas antes de avançar.
// Grupo de tarefas let group = DispatchGroup() group.enter() // Início da tarefa 1 performAsyncOperation1 { print("Tarefa 1 concluída") group.leave() } group.enter() // Início da tarefa 2 performAsyncOperation2 { print("Tarefa 2 concluída") group.leave() } // Notificação ao terminar todas as tarefas do grupo group.notify(queue: .main) { print("Todas as tarefas concluídas, atualizando UI") // Atualizar UI } -
Execução adiada: Executar código após um intervalo de tempo.
// Execução adiada após 2 segundos DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { print("Iniciado após 2 segundos") }
O GCD fornece uma abordagem de alto nível e eficiente para gestão de threads, em comparação com threads tradicionais (por exemplo, Thread), delegando a gestão do pool de threads ao sistema e permitindo usar de forma eficiente processadores multinúcleo.