Introdução às Filas de Tarefas em Swift
\n\nAplicativos móveis e de desktop em Swift frequentemente executam várias operações simultaneamente: carregamento de dados da rede, processamento de imagens, animação da interface. Sem o gerenciamento adequado dessas tarefas, o aplicativo pode "travar" ou ficar lento. As filas de tarefas são um mecanismo que permite organizar a execução do código em segundo plano, sem bloquear a thread principal (UI).
\n\nEm Swift, existem três abordagens principais para trabalhar com filas:
\n- \n
- Grand Central Dispatch (GCD) — API de baixo nível para gerenciamento de filas. \n
- OperationQueue — uma abstração de nível mais alto sobre o GCD. \n
- async/await (Swift 5.5+) — sintaxe assíncrona moderna. \n
Neste artigo, vamos analisar cada abordagem com exemplos práticos, compreensíveis até para iniciantes.
\n\n1. Grand Central Dispatch (GCD) — a base das filas
\n\nGCD é uma biblioteca da Apple que gerencia um pool de threads. Você simplesmente cria uma fila e envia tarefas para ela. O próprio sistema decide em qual thread executar o código.
\n\nTipos de filas no GCD
\n- \n
- Main Queue — executa tarefas na thread principal (apenas atualizações de UI). \n
- Global Queues — filas em segundo plano com diferentes prioridades (userInteractive, userInitiated, utility, background). \n
- Private Queues — suas próprias filas, que podem ser configuradas como seriais (serial) ou concorrentes (concurrent). \n
Exemplo: carregamento de dados em segundo plano
\nimport UIKit\n\nclass ViewController: UIViewController {\n \n @IBOutlet weak var imageView: UIImageView!\n \n override func viewDidLoad() {\n super.viewDidLoad()\n \n // Inicia uma tarefa em uma fila em segundo plano\n DispatchQueue.global(qos: .userInitiated).async {\n let url = URL(string: "https://example.com/image.jpg")!\n if let data = try? Data(contentsOf: url),\n let image = UIImage(data: data) {\n \n // Retorna à thread principal para atualizar a UI\n DispatchQueue.main.async {\n self.imageView.image = image\n }\n }\n }\n }\n}\n\nFilas seriais vs concorrentes
\nUma fila serial executa tarefas uma após a outra. Uma fila concorrente pode iniciar várias tarefas simultaneamente.
\n\n// Fila serial\nlet serialQueue = DispatchQueue(label: "com.example.serial")\nserialQueue.async { print("Tarefa 1") }\nserialQueue.async { print("Tarefa 2") }\n// Saída: Tarefa 1, depois Tarefa 2\n\n// Fila concorrente\nlet concurrentQueue = DispatchQueue(label: "com.example.concurrent", attributes: .concurrent)\nconcurrentQueue.async { print("Tarefa A") }\nconcurrentQueue.async { print("Tarefa B") }\n// Saída: Tarefa A ou Tarefa B (ordem não garantida)\n\n2. OperationQueue — gerenciamento de dependências
\n\nOperationQueue é um wrapper mais conveniente sobre o GCD, que permite:
\n- \n
- Definir dependências entre tarefas. \n
- Cancelar a execução de tarefas. \n
- Gerenciar o número máximo de operações concorrentes. \n
Criação e execução de operações
\nlet operationQueue = OperationQueue()\noperationQueue.maxConcurrentOperationCount = 2 // máximo de 2 tarefas simultâneas\n\nlet operation1 = BlockOperation {\n print("Operação 1 em execução")\n Thread.sleep(forTimeInterval: 1)\n}\n\nlet operation2 = BlockOperation {\n print("Operação 2 em execução")\n Thread.sleep(forTimeInterval: 1)\n}\n\n// Define uma dependência: operation2 só começará após operation1\noperation2.addDependency(operation1)\n\noperationQueue.addOperations([operation1, operation2], waitUntilFinished: false)\n\nCancelamento de operações
\nBlogs
Book Recommendations
Leia também
Como começar a aprender Python do zero
Java ou Python para backend: comparação objetiva 2025