27 votes

Quelle est la différence fondamentale entre NSTimer, NSTask, NSThread et NSRunloop?

Quelle est la différence entre NSTimer , NSTask , NSThread et NSRunloop et y a-t-il une directive sur le moment d'utiliser chacun d'eux?

41voto

Felixyz Points 10705

Chaque programme s'exécute dans au moins un thread. Vous pouvez penser à chaque thread d'un processus distinct de l'exécution du programme, chacun exécutant en parallèle aux autres.

Si vous avez une sorte d'interface utilisateur, ou autre code qui doit écouter les événements (comme les ports réseau), vous avez besoin d'une exécution de la boucle. Chaque NSThread obtient automatiquement son propre exécution de la boucle, et vous ont que très rarement à vous préoccuper directement avec eux. L'exécution de la boucle est également responsable de la création et de libérer autorelease piscines.

[EDIT: Voir les commentaires pour plus de discussion sur autorelease piscines. Le point le plus important à garder à l'esprit est que les nouveaux threads doivent prendre soin de la création d'une autorelease pool. Par exemple, les méthodes qui sont invoqués avec detachNewThreadSelector (voir ci-dessous) doivent avoir la suite de leur première et dernière lignes:

   NSAutoreleasePool *pool = [ [ NSAutoreleasePool alloc ] init ];
   [code here]
   [pool release];

La même chose s'applique pour les threads est généré en utilisant d'autres techniques.]

Dans le thread principal, où l'ensemble de l'INTERFACE utilisateur de la manipulation a lieu, l'exécution de la boucle est très importante, car elle conserve l'interface réactive. C'est pourquoi vous devriez ne jamais exécuter du code qui prend du temps sur le thread principal: il va manger tout le temps sur le fil et l'exécution de la boucle ne sera pas autorisé à exécuter assez souvent, entraînant un blocage ou lenteur de l'interface. Si vous avez besoin d'effectuer de temps de calculs, ou de garder une tâche en cours d'exécution en arrière-plan, vous devez créer un nouveau thread. Encore une fois, vous avez probablement n'avez pas à penser à la nouvelle exécution de la boucle en cours de création. Un moyen facile de l'exécution d'une méthode dans un nouveau thread:

[NSThread detachNewThreadSelector:@selector(theSelector) toTarget:self withObject:nil];

La communication Inter-thread peut être difficile, et vous devriez être au courant des méthodes performSelector:onThread:withObject:waitUntilDone: et performSelectorOnMainThread:withObject:waitUntilDone: (Conseils sur l'envoi de NSNotifications dans les threads ici.)

Les minuteries sont également gérés par des boucles. En revanche pour faire des loops, vous êtes susceptible de souvent à l'aide de chronomètres directement dans votre programme. La très meilleure façon de créer un timer est:

[self performSelector:@selector(aSelector) withObject:nil afterDelay:1.0];

mais parfois, vous voulez créer et gérer NSTimer objets vous-même, par exemple, pour être en mesure de l'annuler et de le ré-utiliser une minuterie.

Un NSTask est utilisé pour exécuter un autre programme en tant que sous-processus de l'actuel. C'est un peu similaire à partir d'un thread séparé, mais si un sous-processus se bloque, votre programme principal va continuer à courir. La Communication entre les programmes est également très différent de la communication entre plusieurs threads d'un même processus.

Vous tagged votre question avec "iphone", et sur l'iPhone, vous ne serez jamais à l'aide de NSTasks.

NSOperations sont utilisés lorsque vous devez gérer une plus grande quantité de tâches différentes, en les plaçant dans des files d'attente et/ou de les traiter dans des threads séparés (bien qu'ils ne pas avoir à courir dans des threads séparés). Si votre application a besoin de créer juste un peu, spécialisé fils, alors il n'y a aucune raison d'utiliser la NSOperation classe. Mais si vous l'habitude de générer des tâches (comme la communication avec un serveur) qui doit être gardé la trace de, NSOperation et NSOperationQueue viendra dans maniable.

3voto

IlDan Points 4104
  • NSTimer est un objet timer, une manière d'invoquer un sélecteur sur un objet dans l'avenir.
  • NSThread est une classe thread. Je suppose que vous savez ce qu'est un thread.
  • NSTask est une classe de processus, un moyen d'exécuter un autre programme à partir de votre programme.
  • NSOperation (je suis en ajoutant à la question) est une très belle abstraction pour une seule tâche. Vous incorporez votre opération dans cette classe et vous pouvez facilement exécuter simultanément par le biais d'une NSOperationQueue classe.
  • NSRunLoop est le plus difficile à comprendre. D'une certaine façon les résumés et adapte le select() appel système unix, la gestion des sources d'entrée et de distribution des événements et des minuteries sur un fil.

La ligne directrice est de l' Apple Filetage Guide de Programmation.

2voto

Lounges Points 3745

Les autres réponses ne un bon travail de synthèse des minuteries, des tâches et des threads. Je souhaite faire un commentaire un peu plus sur le NSRunloop que je pense que la plupart des autres réponses toujours laisser un peu de confusion ici. À partir de la NSRunloop de la documentation:

Un NSRunLoop objet de processus d'entrée des sources telles que la souris et le clavier les événements de la fenêtre système, NSPort des objets, et NSConnection objets. Un NSRunLoop objet de procédés NSTimer événements.

aussi

En général, votre demande n'est pas besoin de créer ou explicitement gérer NSRunLoop objets. Chaque NSThread objet, y compris le application du thread principal, a une NSRunLoop objet créé automatiquement pour elle, en tant que de besoin. Si vous avez besoin de accéder au thread en cours d'exécution de la boucle, vous le faites avec la méthode de classe currentRunLoop.

Pensez à la NSRunloop comme le principal événement de traitement et envoi de la boucle pour un thread particulier. Il lit à partir des périphériques d'entrée, des services de tous les objets qui doivent être entretenus, et distribue les données de manière appropriée.

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