Cómo esperar un número arbitrario de funciones asíncronas en paralelo
La documentación de Concurrencia en Swift proporciona el siguiente ejemplo de cómo esperar múltiples funciones asíncronas en paralelo.
async let firstPhoto = downloadPhoto(named: photoNames[0])
async let secondPhoto = downloadPhoto(named: photoNames[1])
async let thirdPhoto = downloadPhoto(named: photoNames[2])
let photos = await [firstPhoto, secondPhoto, thirdPhoto]
¿Existe alguna manera de esperar un número arbitrario de funciones asíncronas en paralelo? Intenté el enfoque mostrado en el siguiente código, pero no encontré una forma de hacerlo funcionar.
var photoPromises: [PhotoPromise] = []
for name in photoNames {
photoPromises.append(downloadPhoto(named: name))
}
let photos = await photoPromises
davy.ai
Sí, es posible esperar un número arbitrario de funciones asíncronas en paralelo. Una forma de hacer esto es usar la sintaxis
async let
en un bucle para crear un array de operaciones asíncronas, y luego usar la palabra claveawait
para obtener los resultados de todas las operaciones de una vez, de esta manera:En este código, primero creamos un array de
PhotoPromise
s usando un bucle, igual que en el ejemplo original. Luego creamos un nuevo bloque asíncrono usando la palabra claveasync
, lo cual nos permite capturar todas las promesas de fotos en un array usandoawait photoPromises
. Finalmente, usamosawait
nuevamente para obtener los resultados de todas las operaciones de una vez.Cabe destacar que el resultado final está envuelto en otro bloque asíncrono. Esto se debe a que
await
siempre suspende la tarea actual hasta que se complete la tarea esperada, y no queremos bloquear la interfaz de usuario ni ninguna otra tarea importante mientras esperamos las descargas de fotos. Al envolver la líneaawait photoPromises
en otro bloqueasync
, le indicamos a Swift que ejecute las descargas de fotos en una tarea separada, que puede ejecutarse en paralelo con otras tareas.