64 votes

Quelle est la différence entre la "file d'attente globale" et la "file d'attente principale" dans GCD ?

Parmi d'autres moyens, il y a ces deux façons d'obtenir des files d'attente en GCD :

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_get_main_queue();

Si je ne me trompe pas complètement, la "file d'attente principale" s'exécute sur le thread principal et est utile pour les blocs "callback" qui exécutent le travail de l'interface utilisateur.

Cela signifie-t-il qu'une "file d'attente globale" est une file d'attente qui s'exécute en arrière-plan ?

81voto

mattjgalloway Points 24217

La file d'attente principale s'exécute en effet sur le thread principal comme vous le dites.

Les files d'attente globales sont des files d'attente concurrentes et de la page principale de dispatch_get_global_queue :

Contrairement à la file d'attente principale ou dispatch_queue_create(), les files concurrentes globales planifient les blocs dès que des threads sont disponibles (ordre d'achèvement "non-FIFO"). Les files concurrentes globales représentent trois bandes de priorité :

       •   DISPATCH_QUEUE_PRIORITY_HIGH
       •   DISPATCH_QUEUE_PRIORITY_DEFAULT
       •   DISPATCH_QUEUE_PRIORITY_LOW

Les blocs soumis à la file d'attente globale de haute priorité seront invoqués avant ceux soumis à la file d'attente globale par défaut ou de basse priorité. ou à la file d'attente globale de faible priorité. Les blocs soumis à la file d'attente globale de faible priorité ne seront ne seront invoqués que si aucun bloc n'est en attente dans les files d'attente par défaut ou de haute priorité.

Il s'agit donc de files d'attente qui s'exécutent en arrière-plan au fur et à mesure de leur disponibilité. Elles sont "non-FIFO" et l'ordre n'est donc pas garanti.

32voto

jjrscott Points 61

Les 5 files d'attente (4 en arrière-plan, 1 principale) ont toutes des priorités différentes ( -[NSThread threadPriority] ) :

                            -main- : 0.758065
      DISPATCH_QUEUE_PRIORITY_HIGH : 0.532258
   DISPATCH_QUEUE_PRIORITY_DEFAULT : 0.500000
       DISPATCH_QUEUE_PRIORITY_LOW : 0.467742
DISPATCH_QUEUE_PRIORITY_BACKGROUND : 0.000000

(testé sur un iPod 4ème génération et le simulateur sur un MacBook Pro)

8voto

Oui, vous pouvez exécuter un code de ce type sur un appareil pour le tester :

dispatch_async(
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"Block 1a");
            NSAssert(![NSThread isMainThread], @"Wrong thread!");
            NSLog(@"Block 1b");
        });
dispatch_async(
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            dispatch_async(dispatch_get_main_queue(), ^{
                    NSLog(@"Block 2a");
                    NSAssert([NSThread isMainThread], @"Wrong thread!");
                    NSLog(@"Block 2b");
                });
        });

7voto

Lyju I Edwinson Points 101

File d'attente globale :

  1. Les tâches de la file d'attente concurrente sont exécutées simultanément [threads d'arrière-plan].
  2. Les tâches sont toujours lancées dans l'ordre dans lequel elles ont été ajoutées à la file d'attente.

File d'attente principale :

  1. File d'attente sérielle disponible qui exécute les tâches sur le thread principal de l'application. de l'application.
  2. Elle est généralement appelée à partir d'une file d'attente en arrière-plan lorsqu'un traitement en arrière-plan est terminé et que l'interface utilisateur doit être mise à jour. être mise à jour.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X