Colas de tareas en Swift: GCD, OperationQueue y Swift Concurrency

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): GCD, OperationQueue y Swift Concurrency



El desarrollo para iOS y macOS requiere una gestión eficiente de tareas paralelas. Las colas de tareas (Task Queues) son un mecanismo fundamental para crear aplicaciones receptivas y eficientes. En Swift existen tres enfoques principales: el clásico Grand Central Dispatch (GCD), el orientado a objetos OperationQueue y el moderno async/await (Swift Concurrency). En este artículo analizaremos cada uno de ellos en detalle con ejemplos prácticos.



1. Grand Central Dispatch (GCD) — DispatchQueue



GCD es una biblioteca de bajo nivel en lenguaje C, integrada en el núcleo del sistema. En Swift se representa mediante la clase DispatchQueue. Permite ejecutar bloques de código de forma secuencial o concurrente.



Tipos principales de colas:

  • Main Queue — cola secuencial que opera en el hilo principal. Se utiliza para actualizar la interfaz de usuario (UI).
  • Global Queues — colas concurrentes con diferentes prioridades (QoS: userInteractive, userInitiated, utility, background).
  • Custom Queues — colas personalizadas (secuenciales o concurrentes).


Ejemplo: Carga asíncrona de datos con actualización de UI

import UIKit

class ViewController: UIViewController { @IBOutlet weak var imageView: UIImageView!

func loadImage(from url: URL) { // Cambiamos a una cola en segundo plano DispatchQueue.global(qos: .userInitiated).async { [weak self] in guard let data = try? Data(contentsOf: url), let image = UIImage(data: data) else { return }

// Regresamos al hilo principal para actualizar la UI DispatchQueue.main.async { self?.imageView.image = image } } }}


Trabajo con semáforos y grupos

let group = DispatchGroup()let queue = DispatchQueue.global()

group.enter()queue.async { print("Tarea 1 completada") group.leave()}

group.enter()queue.async { print("Tarea 2 completada") group.leave()}

group.notify(queue: .main) { print("Todas las tareas han finalizado")}


2. OperationQueue y Operation



OperationQueue es una capa superior sobre GCD que proporciona una interfaz orientada a objetos. Cada tarea es una instancia de la clase Operation (o su subclase BlockOperation). Principales ventajas: gestión de dependencias, cancelación de tareas y configuración del número máximo de operaciones paralelas.



Ejemplo: Carga con dependencias

let queue = OperationQueue()queue.maxConcurrentOperationCount = 2

let fetchData = BlockOperation { print("Cargando datos...")}

let processData = BlockOperation { print("Procesando datos...")}

let updateUI = BlockOperation { print("Actualizando interfaz")}

// Establecemos dependencias: processData se ejecutará después de fetchDataprocessData.addDependency(fetchData)updateUI.addDependency(processData)

queue.addOperations([fetchData, processData, updateUI], waitUntilFinished: false)


Prioridades y cancelación de tareas

let operation = BlockOperation {    if Task.isCancelled { return }    print("Ejecutando...")}operation.queuePriority = .veryHigh

// Cancelación de la operaciónoperation.cancel()


3. Swift Concurrency (async/await)



A partir de Swift 5.5, Apple introdujo un modelo de asincronía integrado. async/await permite escribir código asíncrono de forma lineal, sin closures. Componentes principales: Task, TaskGroup, actor.



Ejemplo: Carga asíncrona de una imagen

import UIKit

class ImageLoader { func loadImage(from url: URL) async throws -> UIImage { let

Recommendations