web-dev-qa-db-fra.com

dispatch_get_main_queue () dans le thread principal

J'ai une méthode qui fait des changements d'interface dans certains cas.

Par exemple:

-(void) myMethod {

  if(someExpressionIsTrue) {
    // make some UI changes
    // ...
    // show actionSheet for example
  }
}

Parfois, myMethod est appelé depuis mainThread parfois depuis certains other thread.

C'est pourquoi je veux que ces changements d'interface utilisateur soient effectués dans le mainThread.

J'ai changé la partie nécessaire de myMethod de cette façon:

if(someExpressionIsTrue) {
     dispatch_async(dispatch_get_main_queue(), ^{
        // make some UI changes
        // ...
        // show actionSheet for example
      });
}

Donc les questions:

  • Est-ce une solution sûre et bonne d'appelerdispatch_async(dispatch_get_main_queue()dans le thread principal? Influe-t-il sur les performances?
  • Ce problème peut-il être résolu d'une autre meilleure façon? Je sais que je peux vérifier s'il s'agit d'un thread principal en utilisant la méthode [NSThread isMainThread] Et appeler dispatch_async Uniquement en cas de autre thread, mais cela me fera créer une méthode ou un bloc de plus avec ces mises à jour de l'interface utilisateur.
25
B.S.

Il n'y a pas de problème avec l'ajout d'un bloc asynchrone sur la file d'attente principale depuis la file d'attente principale, il ne fait qu'exécuter la méthode plus tard dans la boucle d'exécution.

Ce que vous ne voulez certainement pas faire, c'est d'appeler dispatch_sync en ajoutant un bloc à la file d'attente principale depuis la file d'attente principale car vous finirez par vous verrouiller.

37
Abizern

Ne vous inquiétez pas si vous appelez dispatch_async dans le thread principal ou non. iOS mettra le bloc dans une file d'attente et exécutera le bloc dans le thread principal.

6
Zhengming Ying