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
BlockOperationo subclases propias deOperation. - 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 También en la biblioteca
Trabajo con archivos ZIP en Kotlin: creación, lectura y descompresión
Configuración de aplicaciones en Go: biblioteca viper
Cliente HTTP para Go (Golang): mejores bibliotecas para trabajar con HTTP