Sobes.tech
Middle

Qu'est-ce que Grand Central Dispatch et comment est-il utilisé dans le développement iOS?

sobes.tech IA

Réponse de l'IA

Grand Central Dispatch (GCD) — une API de bas niveau pour gérer le multitâche, fournissant un pool de threads système et planifiant l'exécution des tâches dessus.

Concepts principaux de GCD:

  • Queues de dispatch: Files dans lesquelles sont placés des blocs de code (tâches) pour exécution.
    • Queues sériales: Exécutent les blocs dans l'ordre d'ajout, un à la fois.
    • Queues concurrentes: Exécutent les blocs en parallèle, mais dans l'ordre d'ajout.
  • Tâches (Blocs): Unités de travail envoyées aux queues de dispatch.
  • Sources de dispatch: Surveillance des événements système (fichiers, sockets, signaux), qui invoquent l'exécution des blocs lors de leur apparition.

Utilisé pour:

  1. Exécuter des opérations en arrière-plan: Charger des données du réseau, traiter des images, effectuer des calculs complexes, pour ne pas bloquer le thread principal (UI).

    DispatchQueue.global(qos: .userInitiated).async {
        // Exécuter une opération gourmande en ressources
        let processedData = performHeavyProcessing()
    
        DispatchQueue.main.async {
            // Mettre à jour l'UI sur le thread principal
            updateUI(with: processedData)
        }
    }
    
  2. Planification de tâches: Exécution différée ou périodique.

    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        // Ce code s'exécutera dans 2 secondes
        print("Exécution différée")
    }
    
  3. Synchronisation de l'accès aux données: Utilisation de queues sériales ou DispatchQueue.concurrentPerform pour contrôler l'accès parallèle.

    let syncQueue = DispatchQueue(label: "com.myapp.syncdatasource", attributes: .concurrent)
    var sharedArray = [Int]()
    
    func addItem(_ item: Int) {
        syncQueue.async(flags: .barrier) { // Utilisation de .barrier pour un accès exclusif lors de l'écriture
            sharedArray.append(item)
        }
    }
    
    func processItems() {
        syncQueue.sync { // Lecture synchrone
            for item in sharedArray {
                print(item)
            }
        }
    }
    

Avantages par rapport à la gestion manuelle des threads (POSIX threads):

  • Facilité d'utilisation: Niveau d'abstraction supérieur.
  • Efficacité: GCD gère de manière plus optimale le pool de threads système, réduisant les coûts.
  • Scalabilité: S'adapte automatiquement au nombre de cœurs du processeur.

Types de QoS (Qualité de Service): Détermine la priorité de la tâche pour le planificateur GCD.

QoS Application
userInteractive Mises à jour UI, animations, réponse rapide
userInitiated Tâches initiées par l'utilisateur, nécessitant une exécution rapide (chargement, traitement de photos)
default Priorité par défaut, entre userInitiated et utility
utility Tâches longues sans urgence (chargement, indexation)
background Tâches invisibles pour l'utilisateur (sauvegarde, synchronisation en arrière-plan)
unspecified Priorité non spécifiée, déterminée par le système