Une boucle d'exécution est une abstraction qui (entre autres) fournit un mécanisme pour gérer les sources d'entrée du système (sockets, ports, fichiers, clavier, souris, minuteries, etc.).
Chaque NSThread a sa propre boucle d'exécution, accessible via la méthode currentRunLoop.
En général, vous n'avez pas besoin d'accéder directement à la boucle d'exécution, bien que certains composants (réseau) vous permettent de spécifier la boucle d'exécution qu'ils utiliseront pour le traitement d'E / S.
Une boucle d'exécution pour un thread donné attendra qu'une ou plusieurs de ses sources d'entrée aient des données ou un événement, puis déclenchera le ou les gestionnaires d'entrée appropriés pour traiter chaque source d'entrée qui est "prête".
Après cela, il retournera à sa boucle, traitant les entrées provenant de diverses sources, et «dormant» s'il n'y a pas de travail à faire.
C'est une description de niveau assez élevé (en essayant d'éviter trop de détails).
ÉDITER
Une tentative pour répondre au commentaire. Je l'ai cassé en morceaux.
- cela signifie que je ne peux accéder / exécuter que pour exécuter la boucle à l'intérieur du thread, non?
En effet. NSRunLoop n'est pas thread-safe et ne doit être accessible qu'à partir du contexte du thread qui exécute la boucle.
- y a-t-il un exemple simple comment ajouter un événement pour exécuter une boucle?
Si vous souhaitez surveiller un port, vous ajouterez simplement ce port à la boucle d'exécution, puis la boucle d'exécution surveillera l'activité de ce port.
- (void)addPort:(NSPort *)aPort forMode:(NSString *)mode
Vous pouvez également ajouter une minuterie explicitement avec
- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode
- que signifie qu'il retournera alors à sa boucle?
La boucle d'exécution traitera tous les événements prêts à chaque itération (selon son mode). Vous devrez consulter la documentation pour découvrir les modes d'exécution, car cela dépasse un peu le cadre d'une réponse générale.
- la boucle d'exécution est-elle inactive lorsque je démarre le thread?
Dans la plupart des applications, la boucle d'exécution principale s'exécutera automatiquement. Cependant, vous êtes responsable du démarrage de la boucle d'exécution et de la réponse aux événements entrants pour les threads que vous faites tourner.
- est-il possible d'ajouter des événements à la boucle d'exécution de thread en dehors du thread?
Je ne sais pas ce que vous voulez dire ici. Vous n'ajoutez pas d'événements à la boucle d'exécution. Vous ajoutez des sources d'entrée et des sources de minuterie (à partir du thread qui possède la boucle d'exécution). La boucle de course les surveille ensuite pour l'activité. Vous pouvez, bien sûr, fournir des données d'entrée à partir d'autres threads et processus, mais l'entrée sera traitée par la boucle d'exécution qui surveille ces sources sur le thread qui exécute la boucle d'exécution.
- cela signifie-t-il que parfois je peux utiliser la boucle d'exécution pour bloquer le thread pendant un certain temps
En effet. En fait, une boucle d'exécution "restera" dans un gestionnaire d'événements jusqu'à ce que ce gestionnaire d'événements soit retourné. Vous pouvez le voir dans n'importe quelle application assez simplement. Installez un gestionnaire pour toute action d'E / S (par exemple, appuyez sur un bouton) qui se met en veille. Vous bloquerez la boucle d'exécution principale (et toute l'interface utilisateur) jusqu'à ce que cette méthode se termine.
La même chose s'applique à toute boucle d'exécution.
Je vous suggère de lire la documentation suivante sur les boucles d'exécution:
https://developer.apple.com/documentation/foundation/nsrunloop
et comment ils sont utilisés dans les threads:
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1