Como implementar multitarefa usando filas?
sobes.tech IA
Resposta da IA
Para implementar multitarefa no iOS, utilizam-se tecnologias como GCD (Grand Central Dispatch) ou Operation Queues.
GCD (Grand Central Dispatch)
GCD é uma API de baixo nível em C para gerir tarefas em paralelo através de filas de despacho.
Conceitos principais do GCD:
- Filas de despacho (
Dispatch Queues): Estruturas de dados que gerem a execução de blocos de código (tarefas). Podem ser sequenciais (serial) ou concorrentes (concurrent). - Filas globais concorrentes (
Global Concurrent Queues): Filas do sistema disponíveis por padrão, com diferentes prioridades (qos - Quality of Service). - Fila principal (
Main Queue): É uma fila sequencial ligada ao thread principal da interface de utilizador. Usada para atualizar a interface.
Exemplo de uso do GCD:
import Foundation
// Obter uma fila global concorrente com alta prioridade
let globalQueue = DispatchQueue.global(qos: .userInitiated)
// Obter a fila principal
let mainQueue = DispatchQueue.main
// Executar uma tarefa de forma assíncrona na fila global
globalQueue.async {
// Executar tarefa prolongada...
print("A executar no thread em segundo plano")
// Voltar à fila principal para atualizar a UI (se necessário)
mainQueue.async {
// Atualizar a UI...
print("Atualizar a UI no thread principal")
}
}
// Criar e usar uma fila personalizada sequencial
let serialQueue = DispatchQueue(label: "com.exemplo.minhaFilaSerial")
serialQueue.async {
print("Tarefa 1 na fila sequencial")
}
serialQueue.async {
print("Tarefa 2 na fila sequencial") // Será executada após a Tarefa 1
}
Operation Queues
Operation Queues é uma abstração de alto nível sobre o GCD, baseada em objetos Operation.
Conceitos principais das Operation Queues:
- Operações (
Operation): Objetos que representam unidades de trabalho. Podem ser subclasses deOperation(por exemplo,BlockOperation,URLSessionDownloadTask). Suportam dependências entre operações. - Filas de operações (
OperationQueue): Objeto que gere a execução deOperation. Podem ser configuradas para limitar o número máximo de operações simultâneas (maxConcurrentOperationCount).
Exemplo de uso de Operation Queues:
import Foundation
// Criar uma fila de operações
let operationQueue = OperationQueue()
// Opcional: limitar o número de operações simultâneas
operationQueue.maxConcurrentOperationCount = 3
// Criar operações
let operation1 = BlockOperation {
print("Operação 1 em execução")
// Executar tarefa...
}
let operation2 = BlockOperation {
print("Operação 2 em execução")
// Executar tarefa...
}
// Criar uma operação com um encerramento (alternativa)
let operation3 = BlockOperation {
print("Operação 3 em execução")
// Executar tarefa...
}
// Adicionar um encerramento de finalização (completion block)
operation3.completionBlock = {
print("Operação 3 finalizada")
}
// Adicionar dependências (a Operação 2 será executada após a Operação 1)
operation2.addDependency(operation1)
// Adicionar operações à fila
operationQueue.addOperation(operation1)
operationQueue.addOperation(operation2)
operationQueue.addOperation(operation3)
// As operações começarão a ser executadas de forma assíncrona dependendo dos threads disponíveis e dependências
Comparação entre GCD e Operation Queues:
| Característica | GCD (Grand Central Dispatch) | Operation Queues |
|---|---|---|
| Nível de abstração | Baixo (API em C) | Alto (classes Objective-C/Swift) |
| Gestão de tarefas | Blocos ou funções | Objetos Operation |
| Dependências | Requer gestão manual (por exemplo, DispatchGroup) |
Suporte incorporado via addDependency |
| Cancelamento | Difícil | Fácil (via método cancel() da operação) |
| Estado | Não tem estado explícito | Suporta estados (ready, executing, finished) |
| Supervisão | Requer implementação manual | Suporte com KVO (Key-Value Observing) |
| Complexidade | Melhor para tarefas simples sem necessidade de cancelamento | Melhor para tarefas complexas, dependentes e canceláveis |
A escolha entre GCD e Operation Queues depende da natureza da tarefa. GCD é mais leve e adequado para tarefas simples em segundo plano. Operation Queues oferecem uma gestão mais flexível, suporte para dependências e cancelamento, sendo preferíveis em cenários mais complexos de gestão de tarefas.