282 votes

GCD effectue la tâche dans le thread principal

J'ai un rappel qui peut provenir de n'importe quel thread. Lorsque j'obtiens ce rappel, je voudrais effectuer une certaine tâche sur le thread principal.

Dois-je vérifier si je suis déjà sur le thread principal - ou y a-t-il une pénalité en ne réalisant pas cette vérification befora en appelant le code ci-dessous?

 dispatch_async(dispatch_get_main_queue(), ^{
   // do work here
});
 

164voto

Bavarious Points 43993

Non, vous n'avez pas besoin de vérifier si vous êtes déjà sur le thread principal. En envoyant le bloc dans la file d'attente principale, vous planifiez simplement le bloc à exécuter en série sur le thread principal, ce qui se produit lorsque la boucle d'exécution correspondante est exécutée.

Si vous êtes déjà sur le thread principal, le comportement est le même: le bloc est planifié et exécuté lorsque la boucle d'exécution du thread principal est exécutée.

112voto

Brad Larson Points 122629

Pour l'envoi asynchrone cas que vous décrivez ci-dessus, vous ne devriez pas avoir besoin de vérifier si vous êtes sur le thread principal. Comme Bavarious l'indique, ce sera simplement mis en attente pour être exécuté sur le thread principal.

Toutefois, si vous tentez de le faire ci-dessus à l'aide d'un dispatch_sync() et votre rappel est sur le thread principal, votre demande fera l'impasse à ce point. Je la décris dans ma réponse ici, car ce comportement m'a surpris lors du déplacement du code de -performSelectorOnMainThread:. Comme je l'ai mentionné il ya, j'ai créé une fonction d'assistance:

void runOnMainQueueWithoutDeadlocking(void (^block)(void))
{
    if ([NSThread isMainThread])
    {
        block();
    }
    else
    {
        dispatch_sync(dispatch_get_main_queue(), block);
    }
}

qui va exécuter un bloc de façon synchrone sur le thread principal si la méthode n'est pas actuellement sur le thread principal, et juste exécute le bloc inline si il est. Vous pouvez utiliser la syntaxe comme suit pour utiliser ce:

runOnMainQueueWithoutDeadlocking(^{
    //Do stuff
});

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