Sobes.tech
Junior

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:

  1. 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.
  2. Work Items (Closures/Blocks): Blocos de código que representam uma tarefa a executar.

  3. Grupo de Dispatch: Permite agrupar tarefas e receber notificação quando todas terminarem.

  4. 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.