Logo de Swift en orange sur fond gris qui sert de hero de présentation de la formation sur les fondamentaux de Swift

Programmation asynchrone

Logo de Swift en orange sur fond gris qui sert de hero de présentation de la formation sur les fondamentaux de Swift

Programmation asynchrone

Dans le cours précédent, je t’ai présenté des données au format JSON. En général, ces données se trouvent sur un serveur distant.

Cependant, il y a un cas de figure que nous voulons absolument éviter, si l’appel de ces données est lent, la réception sur notre application le sera également. Ça pourrait vite impatienter nos utilisateurs. C’est là qu’intervient l’asynchrone. Cette technique permet à notre programme de ne pas être bloqué dans l’attente de données.

En utilisant l’asynchrone, nous pouvons continuer à exécuter d’autres tâches pendant que les données sont récupérées en arrière-plan. Ca améliore considérablement l’expérience utilisateur en rendant notre application plus réactive et fluide.

  Introduction à l’asynchrone

Comme on vient de le voir, l’asynchrone permet d’exécuter des tâches en arrière-plan sans bloquer le fil principal de l’application. C’est essentiel pour les opérations qui peuvent prendre du temps, comme le téléchargement de données sur Internet, la lecture de fichiers ou le traitement de grandes quantités de données.

  Concepts de base

Main Thread (Fil Principal) C’est le fil principal sur lequel s’exécutent les opérations de l’interface utilisateur. Il ne doit pas être bloqué pour assurer une expérience utilisateur fluide.

Background Threads (Fils de Fond) Des fils séparés utilisés pour effectuer des tâches longues ou intensives en arrière-plan.

Dans l’exemple illustré, nous avons une application de sport. Sur le fil principal (Main Thread), on trouve une barre de navigation suivie d’un champ de recherche. Les entraînements, qui apparaissent en fils de fond (Background Threads), sont probablement des données distantes et sont chargés de manière asynchrone. Ca permet de ne pas bloquer l’application pendant le chargement des entraînements, assurant ainsi une expérience utilisateur fluide.

  Grand Central Dispatch (GCD)

Grand Central Dispatch (GCD) est une technologie intégrée dans Swift qui permet de gérer efficacement l’exécution de tâches asynchrones. Son but principal est de permettre l’exécution de code en parallèle. Voici quelques concepts clés pour mieux comprendre GCD :

Queues (Files d’attente) Les queues sont des lignes où les tâches sont placées pour être exécutées. GCD utilise deux types principaux de queues :

Main Queue (File Principale) C’est la queue principale qui gère les mises à jour de l’interface utilisateur. Les tâches placées ici sont exécutées sur le fil principal.

Global Queues (Files Globales) Ce sont des queues concurrentes qui gèrent les tâches de fond. Elles sont utilisées pour des opérations intensives en calcul ou pour des tâches d’entrée/sortie comme le téléchargement de données.

Async (Asynchrone) Lorsque tu place une tâche dans une queue en mode asynchrone, cette tâche sera exécutée en arrière-plan sans bloquer le fil principal.

Exemple d’utilisation de GCD

Voici un exemple simple pour illustrer comment utiliser GCD pour exécuter une tâche en arrière-plan et mettre à jour l’interface utilisateur une fois la tâche terminée :


DispatchQueue.global(qos: .background).async {
    for i in 1...5 {
        print("Tâche en arrière-plan \(i)")
        sleep(1)
    }

    DispatchQueue.main.async {
        print("Tâche terminée, mise à jour de l'interface utilisateur.")
    }
}

Dans cet exemple :

Nous utilisons <span style="color: #1f1f24;"><strong>DispatchQueue.global(qos: .background).async</strong></span> pour exécuter une tâche en arrière-plan.

Une fois la tâche de fond terminée, nous utilisons DispatchQueue.main.async pour revenir sur le fil principal et mettre à jour l’interface utilisateur.

PS: La fonction sleep est utilisée pour mettre en pause l’exécution d’un programme pendant une période de temps spécifiée.

 Async/Await

Avec Swift 5.5, le langage a introduit les mots-clés async et await pour simplifier la gestion des tâches asynchrones.


func fetchData() async throws -> String {
    sleep(2)
    return "Données téléchargées"
}

@main
struct MyApp {
    static func main() async {
        do {
            let data = try await fetchData()
            print(data)
        } catch {
            print("Erreur: \(error)")
        }
    }
}

async

Le mot-clé async est utilisé pour déclarer qu’une fonction ou une méthode est asynchrone. Cela signifie que cette fonction peut exécuter des opérations qui prennent du temps sans bloquer le fil d’exécution sur lequel elle a été appelée.

await

Le mot-clé await est utilisé pour appeler une fonction asynchrone et attendre son résultat sans bloquer le fil d’exécution. Il permet d’écrire du code asynchrone de manière séquentielle, ce qui le rend plus facile à lire et à maintenir.

Conclusion

Si tu es arrivé jusqu’ici, félicitations 🎉🍾🥂🎊👏, tu viens de terminer les fondamentaux de Swift.

Il reste encore plein de choses à apprendre sur ce langage, tu les apprendras au fur et à mesure de tes programmes en étant confronté à certaines problématiques.

Si tu dois garder une chose en tête, c’est d’être un maximum autonome dans ton apprentissage, apprendre à apprendre, savoir chercher par soi-même les réponses à nos problèmes est le cœur de notre métier de développeur.

Je t’encourage d’ailleurs à pratiquer un maximum pour bien t’approprier le langage, surtout en Swift natif. Maîtriser un langage, c’est mieux comprendre les frameworks que tu vas utiliser par la suite.

Pour conclure, tu retrouveras de temps à autre de nouveaux cours sur Pixel Swift, où nous aborderons des notions ciblées comme les appels API. Et enfin, quand tu es prêt, tu peux aller voir du côté de SwiftUI et commencer à créer de belles applications .

Illustration 3D d'un personnage stylisé, assis en tailleur, portant un t-shirt noir, un jean retroussé et des baskets noires. Il affiche un signe de paix avec sa main droite et porte une montre connectée au poignet gauche. Son expression est amicale avec un sourire et une barbe bien taillée.