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