124 votes

Comprendre NSRunLoop

Quelqu'un peut-il expliquer ce qu'est NSRunLoop ? Donc, comme je le sais, NSRunLoop est un élément lié à NSThread n'est-ce pas? Donc, supposons que je crée un fil comme

 NSThread* th=[[NSThread alloc] initWithTarget:self selector:@selector(someMethod) object:nil];
[th start];

-(void) someMethod
{
    NSLog(@"operation");
}
 

donc après que ce fil ait fini son travail, non? pourquoi utiliser RunLoops ou où l’utiliser? de la documentation Apple, j'ai lu quelque chose mais ce n'est pas clair pour moi, alors expliquez-le aussi simplement que possible

227voto

Jody Hagins Points 15644

Une course en boucle est une abstraction qui (entre autres choses) fournit un mécanisme permettant de gérer le système des sources d'entrée (sockets, des ports, des fichiers, des claviers, des souris, des minuteries, etc).

Chaque NSThread a sa propre exécution de la boucle, qui peut être consulté via le currentRunLoop méthode.

En général, vous n'avez pas besoin d'accéder à l'exécution de la boucle directement, mais il ya certains (mise en réseau) des composants qui peuvent vous permettre de spécifier les exécuter en boucle qu'ils vont utiliser pour les e/S de traitement.

Une course en boucle pendant un thread donné va attendre jusqu'à ce que l'un ou plusieurs de ses sources d'entrée de certaines données ou de l'événement, puis le feu l'entrée appropriée gestionnaire(s) pour chaque source d'entrée est "prêt"..

Après cela, il va ensuite retourner à sa boucle, le traitement des données en provenance de différentes sources, et "sommeil" si il n'y a pas de travail à faire.

C'est un assez haut niveau de description (en essayant d'éviter un trop grand nombre de détails).

MODIFIER

Une tentative pour répondre au commentaire. Je l'ai cassé en morceaux.

  • cela signifie que je n'ai accès qu'/exécuter pour exécuter la boucle dans le fil droit?

En effet. NSRunLoop n'est pas thread-safe, et ne devrait être accessible à partir du contexte de la thread qui exécute la boucle.

  • est-il un exemple simple comment ajouter un événement à exécuter en boucle ?

Si vous souhaitez contrôler un port, vous voudrais simplement ajouter que le port de l'exécution de la boucle, puis l'exécuter en boucle montre que le port de l'activité.

- (void)addPort:(NSPort *)aPort forMode:(NSString *)mode

Vous pouvez également ajouter un timer explicitement avec

- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode
  • ce qui signifie qu'il va ensuite retourner à sa boucle?

La course de la boucle de traiter les prêts événements de chaque itération (selon le mode). Vous aurez besoin d'examiner la documentation à découvrir sur les modes de fonctionnement, comme c'est un peu au-delà de la portée d'une réponse générale.

  • est exécuté en boucle inactif lorsque je démarre le thread?

Dans la plupart des applications, la course principale de la boucle s'exécutera automatiquement. Cependant, vous êtes en charge le démarrage de l'exécution de la boucle et la réponse à la réception d'événements pour les threads de tourner.

  • est-il possible d'ajouter des événements au Fil exécution de la boucle à l'extérieur du filetage?

Je ne suis pas sûr de ce que vous voulez dire ici. Vous n'avez pas à ajouter des événements à l'exécution de la boucle. Vous ajoutez des sources d'entrée et de la minuterie sources (à partir du thread qui possède l'exécution de la boucle). L'exécution de la boucle, puis regarde à l'activité. Vous pouvez, bien sûr, de fournir des données d'entrée à partir d'autres threads et de processus, mais les données seront traitées par l'exécution de la boucle qui est le suivi de ces sources sur le thread qui exécute l'exécution de la boucle.

  • ça veut dire que parfois, je peux utiliser l'option exécuter en boucle pour bloquer le thread pour un temps

En effet. En fait, une course boucle "séjour" dans un gestionnaire d'événement jusqu'à ce que le gestionnaire d'événement est de retour. Vous pouvez les voir dans n'importe quelle application assez simplement. Installer un gestionnaire pour toute IO action (par exemple, appuyez sur le bouton) qui dort. Vous permet de bloquer la course principale de la boucle (et l'ensemble de l'INTERFACE utilisateur) jusqu'à ce que la méthode est terminée.

La même chose s'applique à toute exécution de la boucle.

Je vous conseille de lire la documentation suivante sur exécuter en boucle:

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsrunloop_Class/Reference/Reference.html

et comment ils sont utilisés dans les discussions:

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1

8voto

akshay Points 3

Runloops sont peu comme une boîte où les choses ne se passe simplement.

En gros, dans Runloop, vous allez à certains événements et de revenir ensuite. OU de la déclaration si elle ne traite pas des événements avant que le délai est atteint. Vous pouvez le dire comme semblable à asynchrones NSURLConnections, le Traitement des données en arrière-plan, sans perturber votre boucle de courant et mais en même temps vous avez besoin de données de façon synchrone. Ce qui peut être fait grâce à l'aide de Runloop qui de faire tenir votre asynchrone NSURLConnection et de fournir les données en temps d'appel. Vous pouvez utiliser Runloop comme suit :-

NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];
while (YourBoolFlag && [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:loopUntil])
loopUntil = [NSDate dateWithTimeIntervalSinceNow:0.1];

dans ce Runloop, il sera exécuté jusqu'à l'achèvement de certains de vos autres activités et définir YourBoolFlag à faux.

De même, vous pouvez les utiliser dans les threads.

Espérons que cela vous aide.

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