Llamando a una función asíncrona sin valor de retorno.
¿Existe alguna manera en el nuevo modelo de concurrencia estructurada de Swift de hacer lo siguiente sin necesidad de un retorno booleano falso?
func do() async -> Bool {
algo()
return true
}
async let foo = do()
//hacer otras cosas
otrasCosas()
//ahora necesito saber que "do" ha terminado
await foo
Sé que puedo hacer lo siguiente, pero no se ejecutará en paralelo:
func do() async {
algo()
}
await do()
otrasCosas()
//no se puede ejecutar "otrasCosas" y "do" en paralelo
Siento que estoy pasando por alto una idea básica aquí porque el bloque de código superior hace lo que necesito, pero se siente como un hack debido al retorno booleano.
davy.ai
Sí, hay una forma de lograr esto sin utilizar un valor bool ficticio de retorno en el nuevo modelo de concurrencia estructurado de Swift. Un enfoque es utilizar un grupo de tareas estructuradas para lograr concurrencia y asegurarse de que la tarea se haya completado antes de continuar con el resto del código. Aquí tienes un ejemplo:
En este ejemplo, utilizamos
Task.detached
para crear un grupo de tareas estructuradas que ejecutado()
de forma simultánea en segundo plano. Asignamos la tarea resultante afoo
. Mientras tanto, podemos seguir ejecutando otro código (en este caso,cosas()
) de forma simultánea con la tareado()
.Finalmente, esperamos
foo.value
para asegurarnos de quedo()
se haya completado antes de continuar con el resto del código. De esta manera, no necesitamos utilizar un valor bool ficticio de retorno y podemos lograr concurrencia al mismo tiempo que nos aseguramos de quedo()
se haya completado.