2010-11-21 3 views
2

Quelle est la différence entre l'utilisation de ceiPhone - fils

[self performSelectorOnMainThread:@selector(doStuff:) 
         withObject:myObject 
        waitUntilDone:YES]; 

au lieu de simplement

[self doStuff:myObject]; 

en termes de charge CPU? Ou y a-t-il d'autres avantages?

merci.

Répondre

2
[self performSelectorOnMainThread:@selector(doStuff:) 
        withObject:myObject 
       waitUntilDone:YES]; 

Ceci permet de s'assurer que le sélecteur est exécuté sur le thread principal en l'ajoutant à la boucle de fonctionnement principale. Lorsque vous définissez waitUntilDone:YES, vous laissez votre thread en cours d'inactivité tant que la boucle d'exécution principale doit exécuter le sélecteur. Dans un environnement à un seul thread, cela laissera le runloop s'exécuter juste après que vous l'ayez appelé, dans un environnement multithread, le runloop principal effectuera le sélecteur une fois qu'il fait l'étape suivante.

Vous avez dans l'un des cas, les deux une petite tête que le sélecteur n'est pas effectuée juste après avoir appelé la fonction, mais à un moment plus tard, alors [self doStuff:myObject]; effectue le sélecteur immédiatement

+0

merci !! J'étais gentil soupçonnant cela! – SpaceDog

+0

Excusez-moi les gars, mais ce n'était pas si précis. Si vous appelez cela du thread principal, la méthode sera exécutée immédiatement parce que le paramètre 'waitUntilDone: YES'. Le message ignorera la boucle d'exécution et il est important de mentionner que la boucle d'exécution ne fonctionnera jamais dans cette condition car la boucle d'exécution principale fera beaucoup de choses, y compris drainer autorelease pool et exécuter des messages en attente, ce qui pourrait affecter la gestion de la mémoire le code. – tia

+0

Salut, merci pour l'info. Je ne savais pas ça! – JustSid

1

Le premier vérifie que votre méthode sera invoquée dans le thread principal. Si vous ne faites pas de multithreading, ils devraient donner le même résultat.

1

Dans votre exemple, le deuxième message sera envoyé tout de suite, tandis que le premier est ajouté à la boucle d'exécution du thread principal afin qu'il ne fonctionne pas immédiatement.