57 votes

Quel est la différence entre performSelectorOnMainThread et dispatch_async sur la file d'attente principale?

J'ai eu des problèmes de la modification d'une vue à l'intérieur d'un thread. J'ai essayé d'ajouter une sous-vue, mais il a fallu environ 6 secondes ou plus à l'écran. J'ai finalement obtenu de travail, mais je ne sais pas exactement comment. Donc, je me demandais pourquoi il a travaillé et quelle est la différence entre les méthodes suivantes:

//this worked -added the view instantly
dispatch_async(dispatch_get_main_queue(), ^{
    //some UI methods ej
    [view addSubview: otherView];
}

//this took around 6 or more seconds to display
[viewController performSelectorOnMainThread:@selector(methodThatAddsSubview:) withObject:otherView
 waitUntilDone:NO];

//Also didnt work: NSNotification methods -  took also around 6 seconds to display
//the observer was in the viewController I wanted to modify
//paired to a method to add a subview.
[[NSNotificationCenter defaultCenter] postNotificationName:
 @"notification-identifier" object:object];

Pour faire référence à cet ont été appelés à l'intérieur de ce Completetion Gestionnaire de la classe de la ACAccountStore.

accountStore requestAccessToAccountsWithType:accountType withCompletionHandler:^(BOOL granted, NSError *error) {
            if(granted) {
            //my methods were here
            }
}

Edit: Quand je dis qu'il ne marchait pas, je voulais dire qu'il a fallu environ 6 secondes pour afficher la vue, ai-je ajouté.

74voto

Kevin Ballard Points 88866

Par défaut, -performSelectorOnMainThread:withObject:waitUntilDone: seulement les horaires le sélecteur à exécuter dans l'exécution par défaut en mode boucle. Si l'exécution de la boucle est dans un autre mode (par exemple, le mode de suivi), il ne fonctionnera pas jusqu'à ce que l'exécution de la boucle permet de revenir à la mode par défaut. Vous pouvez contourner ce problème avec la variante -performSelectorOnMainThread:withObject:waitUntilDone:modes: (en passant par tous les modes que vous voulez qu'il fonctionne).

D'autre part, dispatch_async(dispatch_get_main_queue(), ^{ ... }) va exécuter le bloc dès que la course principale de la boucle renvoie le contrôle des flux de retour de la boucle d'événements. Il ne se soucie pas des modes. Donc, si vous ne voulez pas de soins sur les modes, soit, dispatch_async() peut être la meilleure façon d'aller.

0voto

Ruchira Randana Points 21

Avez-vous essayé le PerformSelectorOnMainThread avec waitUntilDone=OUI

Par exemple: [viewController performSelectorOnMainThread:@selector(methodThatAddsSubview:) withObject:otherView waitUntilDone:YES];

Je pense que cela pourrait résoudre la question de savoir pourquoi la PerformSelectorOnMainThread prend tellement de temps à répondre.

Merci.

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