Filas de Tarefas em Swift: Guia Completo para Iniciantes

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução às Filas de Tarefas em Swift

\n\n

Aplicativos 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\n

Em 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
\n\n

Neste artigo, vamos analisar cada abordagem com exemplos práticos, compreensíveis até para iniciantes.

\n\n

1. Grand Central Dispatch (GCD) — a base das filas

\n\n

GCD é 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\n

Tipos 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
\n\n

Exemplo: carregamento de dados em segundo plano

\n
import 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\n

Filas seriais vs concorrentes

\n

Uma 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\n

2. OperationQueue — gerenciamento de dependências

\n\n

OperationQueue é 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
\n\n

Criação e execução de operações

\n
let 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\n

Cancelamento de operações

\n

Blogs

Book Recommendations