Introduction
Async/Await fait partie des nouveautés du framework Concurrency de Swift. Il a été annoncé lors de la WWDC 21 avec Swift 5.5. Il est donc disponible sur iOS 15 mais est rétro-compatible jusqu’à iOS 13.Concurrency est un framework qui permet d’exécuter plusieurs tâches en parallèle. Avec la nouvelle fonction async et la déclaration await, nous pouvons définir des méthodes pour exécuter des tâches asynchrones.
Et avant ça ?
Avant cette nouveauté, on pouvait le faire (avec NSURLSession et des closures) mais c’était plus complexe et on passait souvent par des librairies open-source pour gagner du temps. On avait aussi la possibilité de passer par le framework (natif) Combine mais ce framework est plus destiné à la reactive programmation. Pour de “simples” appels asynchrones c’est plus lourd à mettre en place que Async/Await et on gagne en lisibilité de code !
Lisibilité de code
Utilisation des closures
Utilisation de Async/Await
Migration
Il est possible faire une migration d’un code asynchrone en closure vers un système Async/Await avec withCheckedThrowingContinuation ou withCheckedContinuation.
Exemples d’utilisation
Si je dois par exemple afficher une liste de données de façon asynchrone en allant chercher ces données depuis deux sources différentes, je peux utiliser await sur chacun de mes appels asynchrones afin de ne pas attendre la réponse du deuxième appel pour commencer à afficher ma liste.
Exécution des Task
Pour exécuter des tâches asynchrone Async/Await depuis un objet synchrone il faut utiliser une Task. Par défaut la Task est User initiated thread (Apple Developer Documentation ), pour l’executer sur un autre thread on peux utiliser Task.detached(priority: .background).
MainActor
Les Actors permettent d’exécuter du code sur un thread spécifique.
MainActor est disponible et peut être déclaré sur une classe , une extension de classe ou une fonction afin d’exécuter du code sur le main thread (@MainActor).
Si le code asynchrone est exécuté sur un autre thread que le main, il est possible de retourner sur le Main Thread avec le code suivant :
Conclusion
Pour conclure pour tout projet Xcode iOS 13+, Async/Await apporte beaucoup d’avantages dont la lisibilité du code et une simplicité de mise en place.
Projet from scratch ? Sans hésitation faites vos appels réseaux avec Async/Await !
Si le projet est existant, une migration progressive pourra être réalisée avec des bénéfices non négligeables pour les maintenances / évolutions futures.
Vous souhaitez en savoir plus ? Contactez-nous !