Comme Jacob, si elles apparaissent la même, ce sont des choses différentes. En fait, il y a une différence significative dans la façon dont ils gèrent l'envoi d'actions pour le thread principal si vous êtes déjà en cours d'exécution sur le thread principal.
Je suis tombé sur cette récemment, où j'ai eu une méthode commune qui, parfois, a été exécuté à partir de quelque chose sur le thread principal, parfois pas. Afin de protéger certaines mises à jour de l'INTERFACE utilisateur, j'avais été en utilisant -performSelectorOnMainThread:
pour eux sans problèmes.
Quand je suis passé à l'aide d' dispatch_sync
sur la file d'attente principale, la demande de blocage à chaque fois que cette méthode a été exécuté sur la file d'attente principale. La lecture de la documentation sur dispatch_sync
,, nous voyons:
L'appel de cette fonction et de ciblage
la file d'attente en cours résultats dans l'impasse.
où pour -performSelectorOnMainThread:
nous voir
attendre
Une valeur Booléenne qui spécifie si l'
actuel thread se bloque jusqu'à ce que après l'
sélecteur de spécifié est effectuée sur la
récepteur sur le thread principal. Spécifier
OUI pour bloquer ce thread; sinon,
spécifiez PAS d'avoir ce retour de méthode
immédiatement.
Si le thread courant est également le principal
fil, et que vous spécifiez OUI pour cette
paramètre, le message est remis
et traitées immédiatement.
Je préfère encore l'élégance de PGCD, le meilleur moment de la compilation de vérifier qu'il fournit, et sa grande souplesse concernant les arguments, etc., j'ai donc fait cette petite aide de la fonction pour empêcher les blocages:
void runOnMainQueueWithoutDeadlocking(void (^block)(void))
{
if ([NSThread isMainThread])
{
block();
}
else
{
dispatch_sync(dispatch_get_main_queue(), block);
}
}
Mise à jour: En réponse à Dave Musée en pointant les mises en garde de la section surdispatch_get_current_queue()
, je l'ai changé à l'aide d' [NSThread isMainThread]
dans le code ci-dessus.
J'utilise ensuite
runOnMainQueueWithoutDeadlocking(^{
//Do stuff
});
pour effectuer les mesures que j'avais besoin de sécuriser sur le thread principal, sans se préoccuper de ce thread la méthode originale a été exécutée.