Évènements multi-tâches et RunLoops sous iOS : Les RunLoops dans l’iOS

Publié le 18 juillet 2011 par Developpementiphone

Une Runloop est essentiellement une boucle d’évènements en cours d’exécution sur un seul thread. La Runloop est ce qui maintient le fonctionnement de votre application jusqu’à ce qu’elles soit quittée. Vous y inscrivez chaque sources potentielles d’entrées, qui pointent vers le code qu’elle doit exécuter chaque fois qu’une entrée est disponible sur ces sources.

Puis, quand l’entrée arrive dans une source particulière, la runloop va exécuter le code approprié, puis revenir à l’état d’attente pour que les entrées accédant aux sources enregistrées puissent de nouveau y arriver.
Si les entrées arrivent dans une source enregistrée alors que la run-loop exécute une autre partie du code, elle finira d’exécuter son code avant de gérer la nouvelle entrée.
L’ordonnanceur est non-préemptif et analogue à la façon dont l’ordonnanceur actif ordonne les requêtes.

Dans toute sa simplicité, il peut être décrit dans la forme glorifiée :

while(true){ HandleEvent1(); HandleEvent2(); }

Le travaille consiste à traiter les évènements qui proviennent de n’importe où.
L’utilisateur a besoin d’écrire du code pour les gérer et l’OS se charge de tous le reste, tel que la planification, la réception et leur envoie.
Le niveau d’abstraction auquel l’utilisateur interagit avec l’OS implique que l’utilisateur ait moins de choses à faire et que l’OS prend en charge le reste.
Il y a exactement une runloop par thread et l’utilisateur ne peut créer ou détruire le même.

CFRunLoopRef currentRunLoop = CFRunLoopGetCurrent(); //Permet d’obtenir la run loop actuelle

CFRunLoopSourceRef runLoopSource = CFSocketCreateRunLoopSource(kCFAllocatorDefault, listeningSocket, 0);


//La source d’évènement est crée avec le socket d’écoute.

CFRunLoopAddSource(currentRunLoop, runLoopSource, kCFRunLoopCommonModes);

//La source d’évènement est finalement ajoutée à la run loop

Maintenant, chaque fois qu’il y aura une requête de connection à la socket, la Runloop appellera la fonction serverAcceptCallback() qui est la fonction de callback pour la listeningSocket.