Sobes.tech
Middle

O que é o Grand Central Dispatch e como é utilizado no desenvolvimento iOS?

sobes.tech IA

Resposta da IA

Grand Central Dispatch (GCD) — uma API de baixo nível para gestão de multitarefa, que fornece um pool de threads do sistema e planeia a execução de tarefas sobre eles.

Conceitos principais do GCD:

  • Filas de despacho: Filas onde são colocados blocos de código (tarefas) para execução.
    • Filas seriais: Executam blocos na ordem de adição, um de cada vez.
    • Filas concorrentes: Executam blocos em paralelo, mas na ordem de adição.
  • Tarefas (Blocos): Unidades de trabalho enviadas às filas de despacho.
  • Fontes de despacho: Monitorização de eventos do sistema (ficheiros, sockets, sinais), que invocam a execução de blocos quando ocorrem.

Usado para:

  1. Executar operações em segundo plano: Carregar dados da rede, processar imagens, cálculos complexos, para não bloquear o thread principal (UI).

    DispatchQueue.global(qos: .userInitiated).async {
        // Executar operação intensiva em recursos
        let processedData = performHeavyProcessing()
    
        DispatchQueue.main.async {
            // Atualizar a UI no thread principal
            updateUI(with: processedData)
        }
    }
    
  2. Planeamento de tarefas: Execução diferida ou periódica.

    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        // Este código será executado em 2 segundos
        print("Execução diferida")
    }
    
  3. Sincronização de acesso a dados: Uso de filas seriais ou DispatchQueue.concurrentPerform para controlar o acesso paralelo.

    let syncQueue = DispatchQueue(label: "com.myapp.syncdatasource", attributes: .concurrent)
    var sharedArray = [Int]()
    
    func addItem(_ item: Int) {
        syncQueue.async(flags: .barrier) { // Uso de .barrier para acesso exclusivo ao escrever
            sharedArray.append(item)
        }
    }
    
    func processItems() {
        syncQueue.sync { // Leitura síncrona
            for item in sharedArray {
                print(item)
            }
        }
    }
    

Vantagens em relação à gestão manual de threads (POSIX threads):

  • Facilidade de uso: Nível de abstração superior.
  • Eficiência: GCD gere de forma mais eficiente o pool de threads do sistema, reduzindo custos.
  • Escalabilidade: Adapta-se automaticamente ao número de núcleos do processador.

Tipos de QoS (Qualidade de Serviço): Define a prioridade da tarefa para o planeador GCD.

QoS Aplicação
userInteractive Atualizações de UI, animações, resposta rápida
userInitiated Tarefas iniciadas pelo utilizador, que requerem rápida conclusão (carregamento, processamento de fotos)
default Prioridade padrão, entre userInitiated e utility
utility Tarefas de longa duração sem urgência (carregamento, indexação)
background Tarefas que não são visíveis ao utilizador (cópias de segurança, sincronização em segundo plano)
unspecified Prioridade não definida, determinada pelo sistema