Async/Await (Parte 6 de 11)
1Paralelización con async let
2Calcular tiempo de ejecución de un código
3¿Qué es un Task?
4¿Qué es un Actor y para que se utilizan?
5¿Qué es Main Actor?
6Modificador task
7Cómo utilizar Task Group
8Trabajando con iteraciones asíncronas usando AsyncSequence
9Mezclando código síncrono y asíncrono usando CheckedContinuation
10Optimiza la eficiencia de tu código concurrente con DiscardingTaskGroup
11Explorando Task-local
Modificador task

Libranner Santos
05 mayo, 20232min de lectura
Cuando trabajamos con SwiftUI, a menudo necesitamos ejecutar código asíncrono antes de que nuestra vista aparezca. Para ello, podemos utilizar el modificador .task(priority:_:).
A continuación, se muestra un ejemplo simple de cómo usar este modificador:
struct MyView: View {var body: some View {Text("Hola mundo").task {await fetch()}}...
En este caso, se utiliza el modificador .task y dentro se llama a la función asíncrona fetch(). Gracias a este modificador, no es necesario colocar el código dentro de un Task. Para ilustrar esto, veamos cómo podemos hacer algo similar sin usar el modificador:
struct MyView: View {var body: some View {Text("Hola mundo").onAppear {Task {await fetch()}}}...
Este código hace virtualmente lo mismo, sin embargo, hay una diferencia fundamental. Si, por ejemplo, navegamos a otra vista y luego volvemos a la vista inicial, onAppear(perform:) se ejecutará nuevamente, pero el código dentro del modificador .task no. Dentro de .task, cualquier tarea en ejecución se cancelará automáticamente cuando la vista desaparezca, lo que ayuda a evitar el desperdicio de memoria y procesador.
Estableciendo la prioridad
Cuando usamos .task, podemos indicar la prioridad que tendrá el código, para que así el sistema pueda determinar cuándo ejecutarlo.
Para indicar la prioridad, podemos hacer lo siguiente:
.task(priority: .utility) {await fetch()}
En este caso utilizamos la prioridad utility. Si deseas saber más sobre esto, puedes leer el artículo: ¿Qué es un Task?.
Usando id para ejecutar la tarea
Otro parámetro muy útil que podemos utilizar es id. Con este, podemos indicar que deseamos que el código dentro de .task se ejecute cada vez que el valor de una variable cambie.
struct MyView: View {@State var runTask: Bool = falsevar body: some View {Text("Hola mundo").task(id: runTask) {await fetch()}}...
Con este código, cada vez que runTask cambie de valor, se ejecutará el código dentro del modificador .task. Hay que tomar en cuenta que, para poder usar la variable, esta debe conformar al protocolo Equatable.
Async/Await (Parte 6 de 11)
1Paralelización con async let
2Calcular tiempo de ejecución de un código
3¿Qué es un Task?
4¿Qué es un Actor y para que se utilizan?
5¿Qué es Main Actor?
6Modificador task
7Cómo utilizar Task Group
8Trabajando con iteraciones asíncronas usando AsyncSequence
9Mezclando código síncrono y asíncrono usando CheckedContinuation
10Optimiza la eficiencia de tu código concurrente con DiscardingTaskGroup
11Explorando Task-local