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
});