Sobes.tech
Middle

Quais ferramentas estão disponíveis no Grand Central Dispatch (GCD)?

sobes.tech IA

Resposta da IA

Principais ferramentas do GCD:

  • Filas de despacho (Dispatch Queues): Gerenciam a execução de blocos de código. Podem ser:
    • Sequenciais (Serial): Executam tarefas uma de cada vez, garantindo a ordem.
    • Paralelas (Concurrent): Executam tarefas simultaneamente (dentro dos recursos do sistema disponíveis).
  • Filas paralelas globais (Global Concurrent Queues): Fornecidas pelo sistema, têm prioridades predefinidas (classes de qualidade de serviço - QoS).
  • Fila principal (Main Queue): Uma fila sequencial especial ligada ao thread principal da aplicação. Usada para trabalhar com a interface do utilizador.
  • Grupos de despacho (Dispatch Groups): Permitem acompanhar a finalização de um conjunto de tarefas assíncronas.
  • Semântica de barreira (Barrier Semantics): Para filas paralelas, permite criar uma "barreira" após a qual apenas tarefas colocadas após a barreira são executadas, até que esta seja ultrapassada.
  • Fontes de despacho (Dispatch Sources): Permitem responder a eventos do sistema (operações de ficheiros, sinais, temporizadores, etc.).
  • DispatchWorkItem: Envolve um bloco de código e pode ser enviado a uma fila, cancelado e notificado ao terminar.

Exemplo de criação de uma fila sequencial e execução de uma tarefa:

let serialQueue = DispatchQueue(label: "com.example.serialQueue")

serialQueue.async {
    // Executa de forma assíncrona na fila sequencial
    print("Tarefa executada na fila sequencial")
}

Exemplo de uso de um grupo de despacho:

let group = DispatchGroup()
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

group.enter() // Entrar no grupo
concurrentQueue.async {
    // Tarefa 1
    print("Tarefa 1 concluída")
    group.leave() // Sair do grupo
}

group.enter() // Entrar no grupo
concurrentQueue.async {
    // Tarefa 2
    print("Tarefa 2 concluída")
    group.leave() // Sair do grupo
}

group.notify(queue: .main) {
    // Executa após a conclusão de todas as tarefas do grupo
    print("Todas as tarefas do grupo foram concluídas")
}

Exemplo de uso de DispatchWorkItem:

let workItem = DispatchWorkItem {
    print("WorkItem executado")
}

DispatchQueue.global().async(execute: workItem)

// workItem.cancel() // Pode cancelar antes de executar