1

Je trouve que dans certains cas, le résultat que j'effectue [self doSomething] directement est différent de celui que j'effectue dans le bloc d'un corps GCD comme ceci:Quelle est la différence entre effectuer une méthode directement et dans le bloc de dispatch_async (dispatch_get_main_queue(),^{})

dispatch_async(dispatch_get_main_queue(), ^{ 

    [self doSomething] 

}) 

j'effectuer [NSThread currentThread] pour confirmer qu'il a déjà été sur le thread principal. Alors, quelle est la difference?

+0

Ce qui précède l'enverra sur le thread principal «asynchonously» sur le prochain cycle d'exécution. L'appel d'une fonction bloquera le thread en cours jusqu'à la fin. – Brandon

+2

L'intention de distribuer de façon asynchrone quelque chose dans la file d'attente principale alors qu'il est déjà sur le thread principal consiste simplement à laisser finir tout ce qui est en cours d'exécution sur le thread principal. À mon humble avis, il est souvent une odeur de code pour un problème de conception plus profonde. Vous verrez ceci lorsque le développeur se trouve au milieu d'un gestionnaire d'événements et veut lancer la tâche suivante, mais cela causerait des problèmes s'il le démarrait immédiatement, alors ils le renvoyeront dans la file d'attente principale. Si vous partagez dans quel contexte vous avez vu ce modèle, nous pouvons commenter davantage. – Rob

Répondre

2

Seul l'appel [self doSomething] sera synchronisé et l'utilisation de sera un appel asynchrone.

Statement A 
[self doSomething] 
Statement B 

code ci-dessus commencera exécution de l'instruction A, terminer Statement A, Lancer exécution de la fonction doSomething, la fonction d'arrivée doSomething puis commencer à exécuter et terminer Statement B.

Statement A 
dispatch_async(dispatch_get_main_queue(), ^{ 
    [self doSomething] 
}) 
Statement B 

-dessus du bloc démarre et l'exécution d'arrivée de Statement A, il ajoute appel de fonction doSomething dans la file d'attente (il peut ou ne peut pas commencer immédiatement) alors il va commencer l'exécution de Statement B sans attendre pour terminer l'exécution de la fonction doSomething . Donc, si Statement B (et d'autres instructions qui suivent votre appel de fonction) est indépendant du résultat de la fonction doSomething, vous pouvez alors effectuer un appel asynchrone.

+0

Est-il donc difficile de savoir si doSth ou Statement B s'exécutera d'abord sur la deuxième condition? – wkx

+0

@wkx, oui, il est difficile de savoir quelle instruction va terminer l'exécution d'abord pour la deuxième condition. – Hardik