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
}
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 {}
}
Top comments (0)