[SWIFT] [GCD] Principes de base de la classe DispatchQueue

Classe DispatchQueue

Un objet qui gère l'exécution en série ou en parallèle de tâches dans les threads principaux ou d'arrière-plan de l'application.

Déclaration


class DispatchQueue : DispatchObject

Les files d'attente d'expédition sont des files d'attente FIFO (premier entré, premier sorti) qui permettent aux applications de passer des tâches sous la forme d'objets de bloc. Les files d'attente de distribution exécutent des tâches en série ou en parallèle. Les tâches placées dans la file d'attente de distribution sont exécutées dans "n'importe quel thread" géré par le système. ** Le système ne garantit pas "dans quel thread la tâche sera exécutée", à l'exception de la file d'attente d'expédition, qui est le thread principal de l'application. ** **

Les tâches sont planifiées de manière synchrone ou asynchrone. Lorsque vous planifiez une tâche de manière synchrone, le code attend la tâche suivante jusqu'à la fin de l'exécution de l'élément. Si vous planifiez des éléments de travail de manière asynchrone, d'autres tâches continueront à s'exécuter pendant qu'elles s'exécutent ailleurs.

** Un blocage se produit lorsque vous essayez d'effectuer un travail de manière synchrone dans la file d'attente principale. ** **

Ne créez pas de fils supplémentaires

Lors de la conception de tâches qui s'exécutent en parallèle, évitez d'appeler des «méthodes qui bloquent les threads en cours d'exécution». Lorsqu'une «tâche planifiée par une file d'attente de distribution parallèle» bloque ce thread, le système crée un thread supplémentaire pour effectuer «d'autres tâches parallèles dans la file d'attente». Si trop de tâches sont bloquées, le système peut manquer de threads dans l'application.

La création d'une «file d'attente de distribution parallèle privée» peut également drainer les threads de votre application. Chaque file d'attente de distribution consomme des ressources de threads, donc la création de files d'attente de distribution parallèles supplémentaires consommera de plus en plus de threads. Au lieu de créer une file d'attente parallèle privée, soumettez la tâche à la «file d'attente de distribution globale parallèle». Pour les tâches série, définissez la cible de la file d'attente série sur l'une des «files d'attente globales simultanées». Ce faisant, vous pouvez conserver le comportement des files d'attente série tout en minimisant les «files d'attente qui créent des threads séparés».

Propriété

propriété principale

La file d'attente de distribution associée au thread principal du processus en cours.

Déclaration


class var main: DispatchQueue { get }

Le système associe la file d'attente principale créée automatiquement au thread principal de l'application. L'application effectue un «bloc envoyé à la file d'attente principale» selon l'une des approches suivantes.

--Appelez la méthode dispatchMain ()

L'appel des méthodes suspend (), resume () et dispatch_set_context (_: _:) sur la file d'attente dans cette propriété n'a aucun effet sur la file d'attente.

Si le thread principal ne répond pas trop longtemps, vous pouvez obtenir une exception 0x8badf00d sur le thread principal de mach_msg_trap. Sur iOS, cette exception peut se produire si une application détecte qu'elle n'a pas réussi à répondre à un événement d'interface utilisateur particulier à temps. Il existe un chien de garde sur iOS qui surveille la réactivité de l'interface utilisateur.

Si votre application comporte des tâches qui prennent beaucoup de temps à exécuter, telles que la connectivité réseau, exécutez-les dans la file d'attente globale du système ou dans une autre file d'attente de répartition en arrière-plan. Si possible, utilisez des appels asynchrones.

Méthode

méthode globale (qos :)

Renvoie une "file d'attente globale système" avec un niveau de qualité de service spécifié.

Déclaration


class func global(qos: DispatchQoS.QoSClass = .default) -> DispatchQueue

Cette méthode renvoie la meilleure file d'attente pour exécuter la tâche au niveau de qualité de service spécifié. L'appel des fonctions suspend (), resume () et dispatch_set_context (_: _:) n'affecte pas la file d'attente renvoyée. Les tâches soumises à la file d'attente renvoyée sont planifiées en parallèle les unes par rapport aux autres.

Un exemple de création d'une file d'attente d'arrière-plan avec un niveau de qualité de service standard


let backgroundQueue = DispatchQueue.global(qos: .default)

Initialiseur

init(label:qos:attributes:autoreleaseFrequency:target:) Créez une nouvelle file d'attente d'envoi qui peut envoyer des "blocs de code".

Déclaration


convenience init(label: String, 
                   qos: DispatchQoS = .unspecified, 
            attributes: DispatchQueue.Attributes = [], 
  autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency = .inherit, 
                target: DispatchQueue? = nil)

Vous trouverez ci-dessous une description des paramètres.

--. Inherit (hérite de la fréquence de libération automatique de la file d'attente cible) --. WorkItem (libéré une fois l'exécution du bloc terminée) --. Jamais (Le bloc ne sera pas libéré automatiquement même après l'exécution.)

Exemple de création d'une file d'attente d'arrière-plan privée


let videoDataOutputQueue = DispatchQueue(label: "VideoDataOutput", 
                                           qos: .userInitiated, 
                                    attributes: [], 
                          autoreleaseFrequency: .workItem)

Recommended Posts

[GCD] Principes de base de la classe DispatchQueue
[GCD] Principes de base de la programmation parallèle dans Swift
Bases de Ruby
[Ruby] Résumé des définitions de classe. Maîtrisez les bases.
Utilisation de la classe Date
Principes de base de l'instruction try-with-resources
[Ruby] Imbrication de classes, héritage et principes de base de soi
[Rails] Introduction aux principes de base du dispositif
Surveillance Docker-expliquant les bases des bases-
Principes de base de l'utilisation des caractères (Java)
Exemple d'utilisation d'une classe abstraite
[Java] Comparateur de la classe Collection
Piège de la classe asList of Arrays
Résumé des bases du langage Java
Résumé de la classe Java Math
[Notions de base Java] Qu'est-ce que la classe?
Bases du branchement conditionnel et du retour
À propos des bases du développement Android
Diverses méthodes de la classe Java String
Les bases de SpringBoot + MyBatis + MySQL
[Ruby] Informations de base sur les classes Date, Heure et DateHeure
Diverses méthodes de la classe String
Bases de Ruby ~ Revue de difficile à comprendre ~
Bases de Ruby 2 ~ Revue des points difficiles ~