"Completion Handler" (manipulador de conclusão) é um bloco de código que é passado como argumento para uma função assíncrona para ser executado quando a operação assíncrona for concluída. Essa abordagem é frequentemente usada para lidar com tarefas que levam algum tempo para serem concluídas, como operações de rede, leitura de arquivos ou outras operações demoradas.

A assinatura básica de uma função com um completion handler em Swift pode parecer com isso:

func minhaFuncaoAssincrona(parametros: Tipo, completion: @escaping (TipoDeRetorno) -> Void) {
    // Implementação assíncrona
    
    // Quando a operação assíncrona for concluída, chame o completion handler
    completion(resultado)
}

Aqui estão os elementos chave:

Exemplo

Vamos criar um exemplo simples de uma função assíncrona em Swift que simula uma operação de download de dados de uma API usando um completion handler. Aqui está um exemplo básico:

import Foundation

// Definindo uma estrutura simples para representar dados baixados
struct DadosBaixados {
    let mensagem: String
}

// Função que simula uma operação assíncrona de download de dados
func baixarDados(completion: @escaping (DadosBaixados) -> Void) {
    // Simulando um atraso de 2 segundos para representar uma operação assíncrona
    DispatchQueue.global().asyncAfter(deadline: .now() + 2) {
        let dados = DadosBaixados(mensagem: "Dados baixados com sucesso!")
        
        // Chamando o completion handler com os dados baixados
        completion(dados)
    }
}

// Exemplo de uso da função com completion handler
baixarDados { dados in
    // Este bloco será executado quando os dados forem baixados
    print(dados.mensagem)
}

Neste exemplo:

  1. DadosBaixados é uma estrutura simples para representar os dados que poderiam ser baixados de uma API real.
  2. baixarDados é uma função que simula uma operação de download assíncrona. Ela aceita um completion handler que será chamado após a simulação do download.
  3. O bloco baixarDados { dados in ... } é onde você fornece o código que deve ser executado quando os dados forem baixados. Dentro desse bloco, você tem acesso aos dados baixados e pode realizar as operações desejadas.

Ao executar este código, você verá a mensagem "Dados baixados com sucesso!" sendo impressa no console após um atraso simulado de 2 segundos, representando a conclusão da operação assíncrona.