Colas de tareas en Swift: Guía completa para principiantes

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción a las colas de tareas en Swift

\n\n

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

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

En este artículo analizaremos cada enfoque con ejemplos prácticos, comprensibles incluso para principiantes.

\n\n

1. Grand Central Dispatch (GCD) — la base de las colas

\n\n

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

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

Ejemplo: descarga de datos en 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        // 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\n

Colas secuenciales vs paralelas

\n

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

2. OperationQueue — gestión de dependencias

\n\n

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

Creación y ejecución de operaciones

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

Cancelación de operaciones

\n

Blogs

Book Recommendations