web-dev-qa-db-fra.com

dispatch_get_global_queue vs dispatch_get_main_queue

Commencer à en apprendre davantage sur les données de base et dispatch_async. Il y a un bloc de code pour obtenir l'url de l'image à partir d'un ensemble de données et le configurer pour modéliser les données de base comme ci-dessous

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
                NSString *urlString = [[[photoDictionary valueForKey:@"images"] objectAtIndex:0] valueForKey:@"url"];
                NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
                dispatch_async(dispatch_get_main_queue(), ^{
                    [photoModel setValue:imageData forKey:@"photoImageData"];

Quelqu'un peut-il m'expliquer pourquoi nous utilisons dispatch_get_global_queue pour le dispatch_async externe et dispatch_get_main_queue pour le dispatch_async interne.

41
tranvutuan

Le dispatch_get_global_queue vous obtient une file d'attente en arrière-plan sur laquelle vous pouvez envoyer des tâches en arrière-plan qui sont exécutées de manière asynchrone (c'est-à-dire qui ne bloqueront pas votre interface utilisateur). Et si vous finissez par soumettre plusieurs blocs aux files d'attente globales, ces travaux peuvent fonctionner simultanément. Si vous avez plusieurs blocs de code que vous souhaitez soumettre à une file d'attente d'arrière-plan que vous devez avoir exécuté séquentiellement en arrière-plan (ce qui n'est pas souvent nécessaire), vous pouvez créer votre propre file d'attente d'arrière-plan en série et y envoyer, mais si des opérations d'arrière-plan simultanées sont acceptable, puis profiter de dispatch_get_global_queue est pratique/efficace.

Sachez cependant que vous n'êtes pas autorisé à effectuer des mises à jour de l'interface utilisateur dans la file d'attente en arrière-plan, donc le dispatch_async au dispatch_get_main_queue permet à cette file d'attente d'arrière-plan d'envoyer les mises à jour de l'interface utilisateur à la file d'attente principale, une fois que la file d'attente principale est disponible.

Il s'agit d'un modèle de programmation très courant: soumettre quelque chose à exécuter en arrière-plan et lorsqu'il doit effectuer des mises à jour utilisateur, renvoyer la mise à jour dans la file d'attente principale.

Pour plus d'informations, reportez-vous au Guide de programmation des accès concurrents .

84
Rob

Le dispatch_get_main_queue doit être utilisé chaque fois que vous souhaitez manipuler des éléments d'interface utilisateur. Cela a à voir avec l'affinité des threads, un modèle commun pour les frameworks d'interface utilisateur. L'affinité de thread signifie que vous ne pouvez manipuler l'objet que sur le thread sur lequel cet objet a été créé. Pour les classes d'interface utilisateur dans Cocoa Touch, c'est le fil principal. Ceci est un idiome typique pour les frameworks d'interface utilisateur sur toutes les plateformes qui comptent.

Alors dispatch_get_main_queue obtient la file d'attente associée au thread principal. Ne pas faire cela provoque des choses étranges lorsque votre interface utilisateur est mise à jour sur un autre thread. Je vois généralement de longues pauses où l'interface utilisateur se fige.

dispatch_get_global_queue obtient toute ancienne file d'attente du niveau de priorité donné associé à votre application. Idéal pour les appels réseau ou, comme dans votre cas, pour travailler avec Core Data.

14
ageektrapped

La file d'attente globale vous donne une file d'attente autre que celle principale, mais vous évite d'avoir à créer votre propre file d'attente. Utilisez get_main_queue lorsque vous avez besoin de votre code pour travailler sur la file d'attente principale (où tout votre travail d'interface utilisateur doit se produire)

9
geraldWilliam
**dispatch_get_main_queue** :- Perform UI updates on this queue

 dispatch_async(dispatch_get_main_queue(), ^{


self.label.text=@"Hello";

    });

**dispatch_get_main_queue**:- Perform background tasks like downloading content

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
    for (int i=0; i<100000;enter code here i++) {
        NSLog(@"HIGH 1 %d", i);
    }
});
2
Ankit garg