Colas de tareas en Swift: GCD, OperationQueue y Combine para iOS/macOS

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

Colas de tareas para Swift (iOS/macOS): Guía completa



En el desarrollo para iOS y macOS, la gestión eficiente de hilos y colas de tareas es clave para crear aplicaciones receptivas y de alto rendimiento. Swift ofrece varias herramientas potentes para trabajar con asincronía: desde el clásico Grand Central Dispatch (GCD) hasta el modelo moderno async/await y el framework Combine. En este artículo, analizaremos los enfoques principales, sus características y ejemplos de uso.



1. Grand Central Dispatch (GCD) — la base del multihilo



GCD es una biblioteca de bajo nivel de Apple para gestionar la ejecución paralela de código. El elemento principal es DispatchQueue, que puede ser serial o concurrente.



Colas principales:

  • main — cola principal (hilo de UI). Todas las actualizaciones de la interfaz deben ejecutarse en ella.
  • global — colas concurrentes del sistema con diferentes prioridades (background, utility, default, userInitiated, userInteractive).
  • custom — colas personalizadas, creadas mediante DispatchQueue(label:attributes:).


Ejemplo: carga de imagen en segundo plano

import UIKit

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


2. OperationQueue — gestión flexible de tareas



OperationQueue es una abstracción de más alto nivel sobre GCD. Permite crear dependencias entre operaciones, establecer el número máximo de tareas concurrentes y cancelar operaciones.



Funcionalidades clave:

  • Creación de BlockOperation o subclases propias de Operation.
  • Establecimiento de dependencias: operation2.addDependency(operation1).
  • Cancelación de todas las operaciones: queue.cancelAllOperations().
  • Control de calidad de servicio (quality of service).


Ejemplo: carga secuencial de archivos

import Foundation

let queue = OperationQueue()queue.maxConcurrentOperationCount = 1 // ejecución secuencial

let fetchMetadata = BlockOperation { print("Cargando metadatos...") Thread.sleep(forTimeInterval: 1)}

let downloadContent = BlockOperation { print("Cargando contenido...") Thread.sleep(forTimeInterval: 2)}

downloadContent.addDependency(fetchMetadata)

queue.addOperations([fetchMetadata, downloadContent], waitUntilFinished: false)print("Operaciones encoladas")


3. Swift Concurrency (async/await) — enfoque moderno



A partir de Swift 5.5, Apple introdujo un modelo de asincronía integrado con las palabras clave async y await. Permite escribir código asíncrono de forma lineal, sin closures ni callbacks.



Componentes principales:

  • async — marcado de función asíncrona.
  • await — espera del resultado de una operación asíncrona.
  • Task — creación de un contexto asíncrono.
  • TaskGroup — agrupación de tareas paralelas.


Ejemplo: carga paralela de datos

import Foundation

func fetchUser(id: Int) async -> String { // Simulación de solicitud de red try? await Task.sleep(nanoseconds: 1_000_000_000) return "User_\\(id)"}

func loadAllUsers() async { await withTaskGroup(of: String

Recommendations