Programación asíncrona en Swift: guía completa 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

Introducción a la programación asíncrona en Swift



Las aplicaciones modernas para iOS y macOS requieren alta capacidad de respuesta y rendimiento. La programación asíncrona en Swift permite ejecutar operaciones largas (solicitudes de red, trabajo con archivos, procesamiento de datos) sin bloquear el hilo principal (Main Thread). A partir de la versión Swift 5.5, Apple presentó el potente modelo Swift Concurrency, basado en las palabras clave async y await, que simplifica significativamente la escritura de código asíncrono en comparación con los closures tradicionales (completion handlers) o DispatchQueue.



En esta guía, analizaremos en detalle todos los conceptos clave: desde los fundamentos de async/await hasta temas avanzados como Actors y Task Groups. Aprenderá a escribir código asíncrono seguro, legible y eficiente para sus proyectos en Swift.



Fundamentos de async/await en Swift



Las palabras clave async y await son el corazón de Swift Concurrency. Permiten escribir código asíncrono que se ve como síncrono, lo que mejora significativamente la legibilidad y reduce la cantidad de errores.



Declaración de una función asíncrona



Para declarar una función como asíncrona, agregue la palabra clave async después de la lista de parámetros, pero antes del tipo de retorno. Dicha función puede pausar su ejecución.



func fetchUserData(from url: URL) async throws -> Data {    let (data, response) = try await URLSession.shared.data(from: url)    // Verificación del estado HTTP    guard let httpResponse = response as? HTTPURLResponse,          httpResponse.statusCode == 200 else {        throw URLError(.badServerResponse)    }    return data}


Llamada a una función asíncrona con await



Para llamar a una función asíncrona se utiliza la palabra clave await. Indica que el código actual puede pausarse en este punto hasta obtener el resultado.



func loadProfile() async {    let url = URL(string: "https://api.example.com/user/profile")!    do {        let data = try await fetchUserData(from: url)        // Procesamiento de datos (por ejemplo, decodificación JSON)        print("Datos recibidos: \\(data.count) bytes")    } catch {        print("Error al cargar el perfil: \\(error.localizedDescription)")    }}


Async let para tareas paralelas



Si necesita ejecutar varias operaciones asíncronas independientes simultáneamente, use la construcción async let. Esto permite iniciar tareas en paralelo y esperar todos los resultados.



func loadDashboardData() async -> Dashboard {    async let user = fetchUserData(from: URL(string: "https://api.example.com/user")!)    async let posts = fetchUserData(from: URL(string: "https://api.example.com/posts")!)    async let notifications = fetchUserData(from: URL(string: "https://api.example.com/notifications")!)

// Esperamos todos los resultados let (userData, postsData, notifData) = await (try user, try posts, try notifications) return Dashboard(user: userData, posts: postsData, notifications: notifData)}


Task y Structured Concurrency



Swift Concurrency se basa en el concepto de Structured Concurrency. Esto significa que cada tarea asíncrona tiene un ciclo de vida claro y una relación padre-hijo. El bloque de construcción principal es Task.



Creación de una nueva tarea



Task crea una nueva unidad de trabajo asíncrona. Puede crear una tarea en un contexto síncrono (por ejemplo, en viewDidLoad).



class ViewController: UIViewController {    override func viewDidLoad() {        super.viewDidLoad()        // Creamos una nueva tarea para ejecutar trabajo asíncrono        Task {            let data = try await fetchUserData(from: URL(string: "https://                

Blogs

Book Recommendations