Fiche 07.01 — async/await, Task, .task et @MainActor
Objectif
Comprendre la concurrence moderne en Swift pour charger des données sans bloquer l’interface. C’est indispensable pour les appels réseau, Firebase, fichiers, images et traitements longs.
1. Le problème
Une app ne doit jamais bloquer l’interface pendant un chargement.
Mauvais principe :
Bon principe :
await indique que le code attend un résultat asynchrone sans bloquer inutilement l’app.
2. Fonction async
Une fonction async peut être suspendue pendant son exécution.
Une fonction throws peut lancer une erreur.
On l’appelle avec :
3. Task dans une action utilisateur
Dans un bouton SwiftUI, on ne peut pas directement faire await dans une closure classique. On utilise Task.
Task lance un contexte asynchrone.
4. .task sur une vue
.task lance une action asynchrone quand la vue apparaît.
.task est souvent préférable à onAppear pour du code async.
5. @MainActor
Les mises à jour de l’interface doivent se faire sur le thread principal. Avec SwiftUI, on marque souvent le ViewModel en @MainActor.
@MainActor simplifie la sécurité des mises à jour UI.
6. do/catch
do/catch est indispensable pour les appels réseau ou services qui peuvent échouer.
7. Cancellation simple
Une tâche peut être annulée, par exemple si l’utilisateur quitte l’écran.
Tu n’as pas besoin de maîtriser tous les détails au début, mais il faut savoir qu’une tâche peut être annulée.
8. Pull to refresh
refreshable fonctionne naturellement avec async/await.
Résumé
asyncdéfinit une fonction asynchrone.awaitattend son résultat.Tasklance du code async depuis une action..tasklance du code async quand une vue apparaît.@MainActorprotège les mises à jour UI.do/catchgère les erreurs.refreshablepermet un pull-to-refresh async simple.