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. ** **
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».
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 ()
UIApplicationMain (_: _: _: _:)
sur iOS et la méthode NSApplicationMain (_: _:)
sur macOS pour démarrer l'application.
--Utilisez le thread principal CFRunLoop
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.
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)
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.
label
Une étiquette qui identifie la file d'attente dans les outils de débogage tels que les rapports d'erreur. Les applications, bibliothèques et frameworks peuvent tous créer leurs propres files d'attente de distribution, nous vous recommandons donc le style de dénomination DNS inversé (com.example.myqueue
). Ce paramètre est facultatif et peut être «NULL».
qos Le niveau de qualité de service associé à la file d'attente. Cette valeur détermine la priorité des tâches planifiées par le système. Voir DispatchQoS.QoSClass (https://developer.apple.com/documentation/dispatch/dispatchqos/qosclass) pour une liste de valeurs configurables.
attributes
Attribut associé à la file d'attente. Vous pouvez inclure l'attribut concurrent
pour créer une file d'attente de distribution qui exécute des tâches en parallèle. Si vous omettez cet attribut, la file d'attente de distribution exécute les tâches en série.
autoreleaseFrequency Fréquence à laquelle la file d'attente libère automatiquement les "objets créés par des blocs planifiés". Voir DispatchQueue.AutoreleaseFrequency pour une liste des valeurs possibles.
--. 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.)
DISPATCH_TARGET_QUEUE_DEFAULT
si vous souhaitez fournir au système une" file d'attente adaptée à l'objet courant ".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