Colas de tareas en Swift: guía práctica

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

Trabajo con colas de tareas en Swift: de la teoría a proyectos reales

\n

En el desarrollo moderno para iOS y macOS, la velocidad de respuesta de la interfaz es un factor clave para el éxito de una aplicación. Cada vez que realizas una operación pesada (carga de imágenes, análisis de JSON, trabajo con bases de datos) en el hilo principal, el usuario ve una "congelación" de la interfaz. La solución son las colas de tareas. En este artículo analizaremos tres enfoques principales para trabajar con colas en Swift: el clásico GCD, el de alto nivel OperationQueue y el moderno async/await. Obtendrás ejemplos de código listos para usar y sabrás qué enfoque elegir para cada tarea específica.

\n\n

1. Grand Central Dispatch (GCD): inicio rápido con DispatchQueue

\n

Grand Central Dispatch es una biblioteca de bajo nivel para gestionar la ejecución paralela de código. Es la base de la multitarea en Swift y sigue siendo la herramienta más eficiente para tareas simples en segundo plano.

\n\n

Tipos principales de colas:

\n
    \n
  • main — cola serial del hilo principal (todas las actualizaciones de la interfaz de usuario solo aquí).
  • \n
  • global(qos:) — colas paralelas con prioridades (userInteractive, userInitiated, utility, background).
  • \n
  • custom(label:) — tu propia cola (puede ser serial o paralela).
  • \n
\n\n

Ejemplo: carga de imagen y actualización de la interfaz de usuario

\n
import UIKit\n\nclass ImageLoader {\n    func loadImage(from url: URL, completion: @escaping (UIImage?) -> Void) {\n        DispatchQueue.global(qos: .userInitiated).async {\n            guard let data = try? Data(contentsOf: url),\n                  let image = UIImage(data: data) else {\n                DispatchQueue.main.async {\n                    completion(nil)\n                }\n                return\n            }\n            DispatchQueue.main.async {\n                completion(image)\n            }\n        }\n    }\n}
\n\n

Consejo práctico: Usa siempre .userInitiated para tareas que el usuario espera de inmediato (por ejemplo, abrir una imagen). Para la sincronización de datos en segundo plano, usa .background.

\n\n

2. OperationQueue: gestión de dependencias y cancelación de tareas

\n

Cuando la lógica se vuelve más compleja (necesitas cancelar una tarea, establecer un orden de ejecución o limitar el número de operaciones paralelas), OperationQueue viene al rescate. A diferencia de GCD, las operaciones son objetos que se pueden reutilizar y controlar.

\n\n

Características clave:

\n
    \n
  • Cancelación de tareas mediante cancel().
  • \n
  • Dependencias (addDependency) — la tarea B se ejecutará solo después de la tarea A.
  • \n
  • Control del número máximo de operaciones paralelas (maxConcurrentOperationCount).
  • \n
\n\n

Ejemplo: carga de varias imágenes con límite de paralelismo

\n
import UIKit\n\nclass BatchImageDownloader {\n    private let queue: OperationQueue = {\n        let q = OperationQueue()\n        q.maxConcurrentOperationCount = 3 // Máximo 3 descargas simultáneas\n        q.qualityOfService = .userInitiated\n        return q\n    }()\n    \n    func downloadImages(from urls: [URL], completion: @escaping ([UIImage]) -> Void) {\n        var images: [UIImage] = []\n        let syncQueue = DispatchQueue(label: "sync.images")\n        \n        let finishOperation = BlockOperation {\n            DispatchQueue.main.async {\n                completion(images)\n            }\n        }\n        \n        for url in urls {\n            let operation = BlockOperation {\n                guard let data = try? Data(contentsOf: url),\n                      let image = UIImage(data: data) else { return }\n                syncQueue.async {\n                    images.append(image)\n                }\n            }\n                

Blogs

Book Recommendations