Middle
Parlez de la file d'attente globale dans la programmation multithread sur iOS.
sobes.tech IA
Réponse de l'IA
La file d’attente globale (Global Queue) dans Grand Central Dispatch (GCD) sont des files d’attente prédéfinies du système accessibles à toutes les applications. Ce sont des files d’attente concurrentes, ce qui signifie que les tâches qu’elles contiennent peuvent s’exécuter en parallèle sur différents threads.
Caractéristiques principales :
- Types : Varient selon le niveau de qualité de service (QoS - Quality of Service).
- QoS : Détermine la priorité d’exécution des tâches, influençant celles que le système doit exécuter plus rapidement.
- Parallélisme : Permettent d’exécuter plusieurs tâches simultanément.
- Systèmes : Créées et gérées par le système d’exploitation.
Types de files d’attente globales (par ordre décroissant de priorité) :
| Niveau de QoS | Description |
|---|---|
userInteractive |
Tâches affectant directement l’interface utilisateur (animations, événements). |
userInitiated |
Tâches initiées par l’utilisateur, mais ne bloquant pas l’UI (chargement de contenu). |
default |
Niveau par défaut sans indication explicite de QoS. |
utility |
Tâches nécessitant du temps d’exécution, mais n’affectant pas immédiatement l’UI (chargement de gros fichiers). |
background |
Tâches exécutées en arrière-plan, invisibles pour l’utilisateur (synchronisation de données). |
unspecified |
Utilisé rarement lorsque le QoS n’est pas important. Équivalent à default. |
Accès aux files d’attente globales :
// Obtenir une file d’attente globale avec un niveau de QoS spécifique
let userInitiatedQueue = DispatchQueue.global(qos: .userInitiated)
// Obtenir la file d’attente globale par défaut
let defaultQueue = DispatchQueue.global()
Utilisation des files d’attente globales pour exécuter des tâches :
// Exécuter une tâche de manière asynchrone dans une file en arrière-plan
DispatchQueue.global(qos: .background).async {
// Code qui prend du temps, sans bloquer l’UI
}
// Exécuter une tâche de manière synchrone dans la file (moins courant pour les files globales)
DispatchQueue.global(qos: .userInitiated).sync {
// Code qui doit être terminé avant de continuer le thread actuel
}
Il est important de se rappeler :
- Ne pas exécuter de tâches affectant directement l’interface utilisateur dans les files d’attente globales (sauf
userInteractivepour des opérations très rapides). Pour mettre à jour l’UI, utilisez la file principale (DispatchQueue.main). - Les files d’attente globales sont destinées à l’exécution parallèle. L’ordre d’exécution des tâches peut ne pas être garanti.
- Lors de l’utilisation de
syncdans une file globale, le thread actuel sera bloqué jusqu’à ce que la tâche soit terminée. Cela peut entraîner un blocage de l’UI si appelé depuis le thread principal.