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. \
También en la biblioteca
Autorización y autenticación en Go: paquetes y ejemplos prácticos
Clientes Redis para Kotlin: Lettuce, Redisson y Kredis
Biblioteca estándar de Kotlin: una visión completa
Generador de códigos QR en Kotlin: creación y configuración de códigos QR
Cliente Elasticsearch para Rust: biblioteca oficial elasticsearch-rs