DEV Community

GoyesDev
GoyesDev

Posted on

SC #1: La historia de async/await

Manejar operaciones asíncronas requería el uso de "completion handler"s, del patrón delegado y de dependencias como GCD, Operation Queue o Combine. Estas herramientas generaban código anidado.

Había problemas como condiciones de carrera, explosión de hilos y problemas de sincronización; que dificultaba asegurar una correcta ejecución multihilo.

Manifiesto de Swift Concurrency

Chris Lattner propuso el Manifiesto de Swift Concurrency con una visión moderna, óptima y segura; que proponía:

  1. Concurrencia estructurada con llamados jerárquicos.
  2. Aislar datos en actores, eliminando carreras de datos.
  3. Hacer que el código asíncrono luzca como el síncrono.
  4. Compatibilidad con otros API concurrentes.

Al eliminar las carreras de datos, el código debería tener una ejecución más determinista, reduciendo las fallas en tiempo de ejecución.

Al migrar a Swift 6 no debería aparecer tantas fallas de tipo EXC_BAD_ACCESS.

Cambio de paradigma

Antes había bloques anidados:

fetchData { result in
  switch result {
  case .success(let data):
    processData(data) { processedData in
      displayData(processedData)
    }
  case .failure(let error):
    handleError(error)
  }
}
Enter fullscreen mode Exit fullscreen mode

La propuesta de Swift Concurrency:

let data = try await fetchData()
let processedData = try await processData(data)
displayData(processedData)
Enter fullscreen mode Exit fullscreen mode

Top comments (0)