Introducción a las colas de tareas en Swift
\n\nLas aplicaciones móviles y de escritorio en Swift a menudo realizan varias operaciones simultáneamente: descarga de datos de la red, procesamiento de imágenes, animación de la interfaz. Sin una gestión adecuada de estas tareas, la aplicación puede "congelarse" o ralentizarse. Las colas de tareas son un mecanismo que permite organizar la ejecución de código en segundo plano sin bloquear el hilo principal (UI).
\n\nEn Swift existen tres enfoques principales para trabajar con colas:
\n- \n
- Grand Central Dispatch (GCD) — API de bajo nivel para gestionar colas. \n
- OperationQueue — una abstracción de más alto nivel sobre GCD. \n
- async/await (Swift 5.5+) — sintaxis asíncrona moderna. \n
En este artículo analizaremos cada enfoque con ejemplos prácticos, comprensibles incluso para principiantes.
\n\n1. Grand Central Dispatch (GCD) — la base de las colas
\n\nGCD es una biblioteca de Apple que gestiona un grupo de hilos. Simplemente crea una cola y envía tareas a ella. El sistema decide por sí mismo en qué hilo ejecutar el código.
\n\nTipos de colas en GCD
\n- \n
- Main Queue — ejecuta tareas en el hilo principal (solo actualizaciones de UI). \n
- Global Queues — colas en segundo plano con diferente prioridad (userInteractive, userInitiated, utility, background). \n
- Private Queues — sus propias colas, que se pueden configurar como secuenciales (serial) o paralelas (concurrent). \n
Ejemplo: descarga de datos en 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 // Iniciamos una tarea en una cola en 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 // Volvemos al hilo principal para actualizar la UI\n DispatchQueue.main.async {\n self.imageView.image = image\n }\n }\n }\n }\n}\n\nColas secuenciales vs paralelas
\nUna cola secuencial ejecuta las tareas una tras otra. Una cola paralela puede iniciar varias tareas simultáneamente.
\n\n// Cola secuencial\nlet serialQueue = DispatchQueue(label: "com.example.serial")\nserialQueue.async { print("Tarea 1") }\nserialQueue.async { print("Tarea 2") }\n// Salida: Tarea 1, luego Tarea 2\n\n// Cola paralela\nlet concurrentQueue = DispatchQueue(label: "com.example.concurrent", attributes: .concurrent)\nconcurrentQueue.async { print("Tarea A") }\nconcurrentQueue.async { print("Tarea B") }\n// Salida: Tarea A o Tarea B (el orden no está garantizado)\n\n2. OperationQueue — gestión de dependencias
\n\nOperationQueue es un envoltorio más conveniente sobre GCD que permite:
\n- \n
- Establecer dependencias entre tareas. \n
- Cancelar la ejecución de tareas. \n
- Gestionar el número máximo de operaciones paralelas. \n
Creación y ejecución de operaciones
\nlet operationQueue = OperationQueue()\noperationQueue.maxConcurrentOperationCount = 2 // máximo 2 tareas simultáneas\n\nlet operation1 = BlockOperation {\n print("Operación 1 en ejecución")\n Thread.sleep(forTimeInterval: 1)\n}\n\nlet operation2 = BlockOperation {\n print("Operación 2 en ejecución")\n Thread.sleep(forTimeInterval: 1)\n}\n\n// Establecemos dependencia: operation2 comenzará solo después de operation1\noperation2.addDependency(operation1)\n\noperationQueue.addOperations([operation1, operation2], waitUntilFinished: false)\n\nCancelación de operaciones
\nBlogs
Book Recommendations
Leer también
Trabajo con bases de datos en C#: PostgreSQL y MongoDB en .NET
Concurrencia y multiproceso en Kotlin: corrutinas, hilos y ejemplos prácticos