Sobes.tech
Middle

Quais métodos existem para colocar tarefas na fila do Grand Central Dispatch (GCD)?

sobes.tech IA

Resposta da IA

Existem as seguintes formas de colocar tarefas na fila GCD:

  1. Execução assíncrona (async): A tarefa é adicionada à fila, e a execução continua imediatamente no thread atual, sem esperar que a tarefa na fila termine.

    DispatchQueue.global().async {
        // Código da tarefa
    }
    
  2. Execução síncrona (sync): A tarefa é adicionada à fila, e o thread atual fica bloqueado até que a tarefa na fila seja concluída. Evite usar sync no thread principal para tarefas de longa duração para não bloquear a UI.

    DispatchQueue.global().sync {
        // Código da tarefa, o thread atual aguardará
    }
    
  3. Execução adiada (asyncAfter): A tarefa é adicionada à fila com um atraso especificado. A execução começará não antes do tempo indicado.

    DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) {
        // O código da tarefa será executado após 2 segundos
    }
    
  4. Execução em grupo (DispatchGroup): As tarefas podem ser adicionadas a um DispatchGroup para sincronizar sua finalização. Pode-se esperar que todas terminem ou ser notificado (notify) após sua conclusão.

    let group = DispatchGroup()
    
    group.enter()
    DispatchQueue.global().async {
        // Tarefa 1
        group.leave()
    }
    
    group.enter()
    DispatchQueue.global().async {
        // Tarefa 2
        group.leave()
    }
    
    group.notify(queue: .main) {
        // Todas as tarefas no grupo foram concluídas
    }
    
  5. Execução de iterações (concurrentPerform): Permite executar um bloco de código iterations vezes em paralelo em uma fila concorrente.

    DispatchQueue.concurrentPerform(iterations: 100) { index in
        // Código que será executado para cada índice em paralelo
    }
    
  6. DispatchWorkItem: Envolve um bloco de código e permite cancelar a tarefa antes de ela começar ou após adicioná-la à fila, se ela ainda não tiver iniciado.

    var workItem: DispatchWorkItem?
    
    workItem = DispatchWorkItem {
        // Código da tarefa
    }
    
    DispatchQueue.global().async(execute: workItem!)
    
    // Pode cancelar a tarefa se ela ainda não tiver começado
    // workItem?.cancel()