Planificador de tareas 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

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

El planificador de tareas (Task Scheduler) es un componente clave en el desarrollo para iOS y macOS, que permite gestionar eficientemente operaciones asíncronas, tareas en segundo plano y multitarea. En Swift, hay varias herramientas potentes disponibles: Grand Central Dispatch (GCD), OperationQueue, el nuevo mecanismo async/await (Swift Concurrency) y el framework Combine. En este artículo, analizaremos cada uno en detalle, proporcionaremos ejemplos de código y recomendaciones para elegir la herramienta adecuada.



1. Grand Central Dispatch (GCD)

GCD es una biblioteca de bajo nivel para gestionar tareas paralelas. Funciona con colas (DispatchQueue) y garantiza una distribución eficiente de los hilos.



Tipos principales de colas:

  • main — cola principal (hilo de UI).
  • global — colas en segundo plano con diferentes prioridades (QoS).
  • private — colas personalizadas (serial o concurrent).


Ejemplo de uso de GCD:

import Foundation

// Tarea asíncrona en segundo planoDispatchQueue.global(qos: .background).async { let result = performHeavyComputation() // Volvemos al hilo principal para actualizar la UI DispatchQueue.main.async { updateUI(with: result) }}

// Cola serial para ejecución secuenciallet serialQueue = DispatchQueue(label: "com.example.serial")serialQueue.async { // Tarea 1}serialQueue.async { // Tarea 2 (se ejecutará después de la tarea 1)}

// Cola concurrentelet concurrentQueue = DispatchQueue(label: "com.example.concurrent", attributes: .concurrent)concurrentQueue.sync { // Operación bloqueante (¡cuidado!)}


2. OperationQueue

OperationQueue es una abstracción de más alto nivel sobre GCD. Trabaja con objetos Operation, que se pueden configurar, cancelar y vincular con dependencias.



Ventajas de OperationQueue:

  • Gestión flexible de dependencias entre tareas.
  • Soporte integrado para cancelación y prioridades.
  • Observación KVO del estado de las operaciones.


Ejemplo con BlockOperation:

import Foundation

let operationQueue = OperationQueue()operationQueue.maxConcurrentOperationCount = 2

let operation1 = BlockOperation { print("Tarea 1")}let operation2 = BlockOperation { print("Tarea 2")}let operation3 = BlockOperation { print("Tarea 3")}

// Establecemos dependencia: la tarea 3 se ejecutará después de las tareas 1 y 2operation3.addDependency(operation1)operation3.addDependency(operation2)

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

// Cancelar todas las operacionesoperationQueue.cancelAllOperations()


Creación de una subclase propia de Operation:

class DownloadOperation: Operation {    private let url: URL        init(url: URL) {        self.url = url    }        override func main() {        guard !isCancelled else { return }        // Realizamos la descarga        let data = try? Data(contentsOf: url)        // Procesamiento del resultado    }}

let downloadOp = DownloadOperation(url: URL(string: "https://example.com/data")!)operationQueue.addOperation(downloadOp)


3. Swift Concurrency (async/await)

A partir de Swift 5.5, se introdujo soporte integrado para programación asíncrona mediante las palabras clave async, await y Task. Esta es una forma moderna y segura de trabajar con concurrencia.



Componentes principales:

  • async — marca una función asíncrona.
  • await — espera la finalización de una operación asíncrona.
  • Task — crea una nueva tarea asíncrona.
  • TaskGroup — ejecución grupal de tareas.
  • \

Recommendations