2010-05-29 4 views
4

J'ai créé une application de test pour exécuter une boucle de compteur profond. Je lance la fonction de boucle dans le thread d'arrière-plan en utilisant performSelectorInBackground et NSOperation sous-classe séparément. J'utilise également performSelectorOnMainThread pour notifier le thread principal dans la méthode backgroundthread et [NSNotificationCenter defaultCenter] postNotificationName dans la sous-classe NSOperation pour notifier le thread principal de la mise à jour de l'interface utilisateur. Initialement à la fois l'implémentation me donnant le même résultat et je suis en mesure de mettre à jour l'interface utilisateur sans avoir de problème. La seule différence que j'ai trouvée est le nombre de Thread entre deux implémentations.Différence entre performSelectorInBackground et NSOperation Sous-classe

La mise en œuvre performSelectorInBackground a créé un fil et se est terminée au bout de la boucle terminée et mon application fil compte va de nouveau à 1.

La mise en œuvre de la sous-classe NSOperation a créé deux nouveaux threads et garder existe dans l'application et je peux voir 3 fils de discussion après la boucle a fini dans la fonction principale(). Donc, ma question est pourquoi deux threads ont été créés par NSOperation et pourquoi ils ne se sont pas terminés comme la première implémentation de threads d'arrière-plan?

Je suis un peu confus et incapable de décider quelle implémentation est la meilleure en termes de performance et de gestion de la mémoire.

+0

Il semble que NSOperationQueue conserve les threads et ne les a pas libérés. Des pensées à ce sujet? – AmitSri

Répondre

6

Il est probable que la file d'attente d'exploitation garde les threads actifs, en attendant que de nouvelles opérations apparaissent. Vous devez vous rappeler que la file d'attente d'opérations est conçue pour fonctionner efficacement avec de nombreuses opérations, donc créer et détruire des threads pour chaque opération va nuire aux performances. Donc, ce que vous voyez est probablement juste la façon dont la file d'attente est conçue pour fonctionner en gardant un pool de threads en vie.

Fondamentalement, tant que vous utilisez la file d'attente correctement et selon la documentation, je ne m'inquiéterais pas.

+0

Merci, cela signifie que je peux réutiliser la même file d'attente d'opérations pour plusieurs tentatives pour la même opération/boucle ou est-il possible de vider le pool de threads créé par la file d'attente d'opération. – AmitSri

+0

AmitSri: Vous pouvez mettre autant d'opérations que vous le souhaitez dans une file d'attente. Vous pouvez * jeter * la file d'attente et en créer une nouvelle plus tard, mais il n'y a aucune raison de performance pour cela - les threads n'utilisent pas de temps de processeur, sauf s'il y a quelque chose sur eux, donc il n'y a aucune raison de les jeter. (Cochez cette case dans Moniteur d'activité si vous ne me croyez pas et si vous voyez que votre application * utilise * le temps CPU, profilez dans Instruments ou Shark pour voir à quoi elle sert pendant ce temps.) –

+0

@Mike Weller à l'intérieur de la file d'attente sera détruit à la fin.am j'ai raison? –