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