es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
Tags:  ,

Answer

  1. Avatar for 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 clave await para obtener los resultados de todas las operaciones de una vez, de esta manera:

    var photoPromises: [PhotoPromise] = []
    for name in photoNames {
        photoPromises.append(downloadPhoto(named: name))
    }
    let allPhotos = await async { await photoPromises }
    

    En este código, primero creamos un array de PhotoPromises usando un bucle, igual que en el ejemplo original. Luego creamos un nuevo bloque asíncrono usando la palabra clave async, lo cual nos permite capturar todas las promesas de fotos en un array usando await photoPromises. Finalmente, usamos await 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ínea await photoPromises en otro bloque async, le indicamos a Swift que ejecute las descargas de fotos en una tarea separada, que puede ejecutarse en paralelo con otras tareas.

Comments are closed.