Trabajo con 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



Las aplicaciones móviles y de escritorio modernas deben ser rápidas y receptivas. Si realiza cálculos pesados o carga datos de la red directamente en el hilo principal, su aplicación se congelará y el usuario simplemente la cerrará. La solución son las colas de tareas (queues).



En Swift (iOS/macOS), la gestión de la asincronía se basa en tres tecnologías principales: Grand Central Dispatch (GCD), Operation Queue y la sintaxis moderna async/await. En este artículo, analizaremos cada una desde cero, mostraremos ejemplos de código y explicaremos cuándo usar cada una.



1. Grand Central Dispatch (GCD) y DispatchQueue



GCD es una biblioteca de bajo nivel de Apple para gestionar la ejecución paralela de código. El elemento principal es DispatchQueue. La cola ejecuta las tareas (cierres) en el orden en que se añaden.



Tipos de colas



  • Main Queue — cola secuencial del hilo principal. Se utiliza para actualizar la interfaz de usuario.
  • Global Queues — colas paralelas con diferentes prioridades (QoS: .userInteractive, .userInitiated, .utility, .background).
  • Custom Queues — sus propias colas (secuenciales o paralelas).


Ejemplo: ejecutar una tarea en segundo plano



import Foundation

// Asíncrono en una cola en segundo planoDispatchQueue.global(qos: .background).async { // Trabajo pesado (carga, procesamiento de datos) let result = performHeavyTask() // Devolvemos el resultado al hilo principal DispatchQueue.main.async { updateUI(with: result) }}

func performHeavyTask() -> String { Thread.sleep(forTimeInterval: 2) // simulación de trabajo return "¡Listo!"}

func updateUI(with text: String) { print("UI actualizado: \\(text)")}


Tenga en cuenta: .async no bloquea el hilo que llama. Si necesita esperar el resultado, use .sync (pero nunca llame a .sync desde el hilo principal, obtendrá un deadlock).



Ejemplo: cola secuencial



let serialQueue = DispatchQueue(label: "com.example.serial")

serialQueue.async { print("Tarea 1")}serialQueue.async { print("Tarea 2")}// Salida: Tarea 1, luego Tarea 2


2. Operation Queue — un enfoque más flexible



OperationQueue es una capa superior sobre GCD que proporciona una interfaz orientada a objetos. Crea una Operation (o BlockOperation), configura dependencias y la añade a la cola.



Ventajas sobre GCD



  • Cancelación de tareas (cancel())
  • Dependencias entre tareas
  • Monitoreo de estado (isReady, isExecuting, isFinished)
  • Número máximo de operaciones paralelas


Ejemplo: uso básico



let operationQueue = OperationQueue()operationQueue.maxConcurrentOperationCount = 2 // no más de 2 tareas simultáneas

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

let operation2 = BlockOperation { print("Procesando datos...") Thread.sleep(forTimeInterval: 1)}

// operation2 comenzará solo después de que finalice operation1operation2.addDependency(operation1)

operationQueue.addOperations([operation1, operation2], waitUntilFinished: false)


Ejemplo: cancelación de una operación



let cancelableOp = BlockOperation {    if !cancelableOp.isCancelled {        print("Realizando trabajo importante")    }}

operationQueue.addOperation(cancelableOp)

// Después de un tiempo cancelamosDispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { cancelableOp.cancel() print("Operación cancelada")}

Blogs

Book Recommendations