2016-11-16 1 views
4

Swift 3, la création d'une instance DispatchQueue:paramètre cible dans DispatchQueue

DispatchQueue(label: String, 
       qos: DispatchQoS, 
       attributes: DispatchQueue.Attributes, 
       autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency, 
       target: DispatchQueue?) 

Je vois les codes des échantillons de Stackoverflow, il peut être nul, .global() ou .main, quel est le sens de ce paramètre target?

Je suppose que .main signifie que la file d'attente s'exécutera sur le thread principal, mais qu'en est-il de .nil ou .global()?

Répondre

2

La cible est expliquée par Apple comme:.

« La priorité Une file d'attente d'envoi est héritée de sa file d'attente cible Utilisez la fonction dispatch_get_global_queue pour obtenir une file d'attente cible appropriée de la priorité souhaitée Si vous soumettez un bloc. à une file d'attente série, et la file d'attente cible de la file d'attente série est une file d'attente série différente, ce bloc n'est pas appelé simultanément aux blocs soumis à la file d'attente cible ou à toute autre file d'attente avec cette même file d'attente cible.

https://developer.apple.com/reference/dispatch/1452989-dispatch_set_target_queue

1. .main se déroulera sur le thread principal. Le thread principal est principalement utilisé pour le travail de l'interface utilisateur. Par conséquent, vous devez faire preuve de prudence lorsque vous utilisez ce thread pour un travail qui n'est pas lié à l'interface utilisateur, car l'interface utilisateur risque de se bloquer ou de ne pas répondre. Cette file d'attente a la priorité la plus élevée.

2. .global est principalement utilisé pour d'autres travaux qui Ui pas lié. et planifie les blocs lorsque les threads deviennent disponibles. la file d'attente globale a trois priorités Low, Default & High. Cette file d'attente a la deuxième priorité la plus élevée avec 3 types différents.

3. nil est la priorité la plus basse et sera inférieure à toute file d'attente globale. il n'a pas de priorité, il doit juste être fait.

Résumé

.main comme cible pour le travail de l'interface utilisateur

.global comme cible pour d'autres travaux qui doit être fait le plus tôt possible

nulle comme cible pour le travail qui a juste besoin à faire à un certain moment (vous n'êtes pas dérangé quand)

+0

Il est toujours déroutant. Quel est le "finalizer" que l'objet va invoquer? Et quelle est la relation avec Qos? – allenlinli

+0

Chaque file d'attente a sa propre priorité comme je l'ai expliqué dans ma réponse. Qos signifie «qualité de service» et vous permet de catégoriser des tâches individuelles dans cette file d'attente. En décrivant le travail en utilisant Qos, vous pouvez vous assurer qu'il est économe en énergie et également définir une sous-priorité dans la file d'attente. Disons donc que vous avez deux morceaux d'interface utilisateur qui s'exécutent sur le thread principal. Vous pouvez indiquer que work1 est une priorité plus élevée que work2 en spécifiant un Qos. – torinpitchers

4

Il n'y a pas de documentation pour Swift alors je suis revenu à l'ancienne documentation pour GCD. Le plus proche que j'ai trouvé est pour la fonction dispatch_set_target_queue:

La file d'attente cible d'un objet est responsable du traitement de l'objet. La file d'attente cible détermine la file d'attente sur laquelle le finaliseur de l'objet est appelé. De plus, la modification de la file d'attente cible de certains objets change leur comportement:

files d'attente: Dispatch

la priorité Une file d'attente d'envoi est héritée de sa file d'attente cible. Utilisez la fonction dispatch_get_global_queue pour obtenir une file d'attente cible appropriée de la priorité souhaitée.Si vous soumettez un bloc à une file d'attente série et que sa file d'attente est une file d'attente série différente, ce bloc n'est pas appelé simultanément avec les blocs soumis à la file d'attente cible ou à toute autre file d'attente.

ressemble tellement la file d'attente target fait 2 choses:

  1. fournir les priorty pour votre nouvelle file d'attente
  2. Exécute le finaliseur (deinit) de tous les objets dans votre file d'attente

En lisant entre les lignes, il y a une certaine synchronisation entre votre file d'attente et la file d'attente cible. Je n'ai pas Xcode pour le moment donc je ne peux pas tester.