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.

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.

Tags:  , ,

Answer

  1. Avatar for 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:

    func do() async {
      algo()
    }
    
    async let foo = Task.detached {
      await do()
    }
    
    // hacer otras cosas de forma simultánea
    cosas()
    
    // ahora esperamos a que la tarea se complete
    await foo.value
    

    En este ejemplo, utilizamos Task.detached para crear un grupo de tareas estructuradas que ejecuta do() de forma simultánea en segundo plano. Asignamos la tarea resultante a foo. Mientras tanto, podemos seguir ejecutando otro código (en este caso, cosas()) de forma simultánea con la tarea do().

    Finalmente, esperamos foo.value para asegurarnos de que do() 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 que do() se haya completado.

Comments are closed.