DEV Community

GoyesDev
GoyesDev

Posted on

SC #7: Task

Task permite ir desde un contexto síncrono hacia otro asíncrono.

Si se quiere invocar un método asíncrono desde uno síncrono no se puede hacer de la siguiente forma, porque saldrá el error:

'async' call in a function that does not support concurrency

Por esta razón, se debe envolver el llamado asíncrono en un Task, que ejecuta su trabajo inmediatamente se define, sin necesidad de iniciarlo explícitamente.

func metodoSincronoMalo() {
  await metodoAsincrono()
  // ❌ 'async' call in a function that does not support concurrency
}
func metodoSincronoCorrecto() {
  Task {
    await metodoAsincrono()
  }
}
func metodoAsincrono() async {
  // Cualquier cosa asíncrona
}
Enter fullscreen mode Exit fullscreen mode

Mantener una referencia de un Task

No es indispensable mantener una referencia de Task para que funcione, sin embargo, si se quiere esperar sus resultados o cancelarla, se debe conservar una referencia a ella.

class SomeCommand {
  var innerTask: Task<Void, Never>?

  func execute() {
    innerTask: = Task {
      await metodoAsincrono()
    }
  }

  deinit {
    innerTask:?.cancel()
  }

  private func metodoAsincrono() async {}
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)