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:
- Concurrencia estructurada con llamados jerárquicos.
- Aislar datos en actores, eliminando carreras de datos.
- Hacer que el código asíncrono luzca como el síncrono.
- 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)
}
}
La propuesta de Swift Concurrency:
let data = try await fetchData()
let processedData = try await processData(data)
displayData(processedData)
Top comments (0)