Eine Run-Schleife ist eine Abstraktion, die (unter anderem) einen Mechanismus zur Verarbeitung von Systemeingabequellen (Sockets, Ports, Dateien, Tastatur, Maus, Timer usw.) bietet.
Jeder NSThread verfügt über eine eigene Ausführungsschleife, auf die über die currentRunLoop-Methode zugegriffen werden kann.
Im Allgemeinen müssen Sie nicht direkt auf die Ausführungsschleife zugreifen, obwohl es einige (Netzwerk-) Komponenten gibt, mit denen Sie möglicherweise angeben können, welche Ausführungsschleife für die E / A-Verarbeitung verwendet wird.
Eine Ausführungsschleife für einen bestimmten Thread wartet, bis eine oder mehrere seiner Eingabequellen Daten oder Ereignisse enthalten, und löst dann die entsprechenden Eingabehandler aus, um jede Eingangsquelle zu verarbeiten, die "bereit" ist.
Danach kehrt es zu seiner Schleife zurück, verarbeitet Eingaben aus verschiedenen Quellen und "schläft", wenn keine Arbeit zu erledigen ist.
Das ist eine ziemlich allgemeine Beschreibung (versucht zu viele Details zu vermeiden).
BEARBEITEN
Ein Versuch, den Kommentar anzusprechen. Ich habe es in Stücke gebrochen.
- es bedeutet, dass ich nur auf die Schleife innerhalb des Threads zugreifen / sie ausführen kann, oder?
Tatsächlich. NSRunLoop ist nicht threadsicher und sollte nur über den Kontext des Threads aufgerufen werden, in dem die Schleife ausgeführt wird.
- Gibt es ein einfaches Beispiel für das Hinzufügen eines Ereignisses zur Ausführungsschleife?
Wenn Sie einen Port überwachen möchten, fügen Sie diesen Port einfach der Ausführungsschleife hinzu, und die Ausführungsschleife überwacht diesen Port auf Aktivität.
- (void)addPort:(NSPort *)aPort forMode:(NSString *)mode
Sie können einen Timer auch explizit mit hinzufügen
- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode
- Was bedeutet, dass es dann zu seiner Schleife zurückkehrt?
Die Ausführungsschleife verarbeitet alle Bereitschaftsereignisse bei jeder Iteration (entsprechend ihrem Modus). Sie müssen sich die Dokumentation ansehen, um Informationen zu den Ausführungsmodi zu erhalten, da dies etwas über den Rahmen einer allgemeinen Antwort hinausgeht.
- Ist die Run-Schleife inaktiv, wenn ich den Thread starte?
In den meisten Anwendungen wird die Hauptlaufschleife automatisch ausgeführt. Sie sind jedoch dafür verantwortlich, die Ausführungsschleife zu starten und auf eingehende Ereignisse für von Ihnen gesponnene Threads zu reagieren.
- Ist es möglich, einige Ereignisse zur Thread-Run-Schleife außerhalb des Threads hinzuzufügen?
Ich bin mir nicht sicher, was du hier meinst. Sie fügen der Ausführungsschleife keine Ereignisse hinzu. Sie fügen Eingabequellen und Timerquellen hinzu (aus dem Thread, dem die Ausführungsschleife gehört). Die Run-Schleife überwacht sie dann auf Aktivität. Sie können natürlich Daten von anderen Threads und Prozessen bereitstellen, aber die Eingabe wird von der Ausführungsschleife verarbeitet, die diese Quellen in dem Thread überwacht, in dem die Ausführungsschleife ausgeführt wird.
- Bedeutet das, dass ich manchmal die Run-Schleife verwenden kann, um den Thread für eine Weile zu blockieren?
Tatsächlich. Tatsächlich "bleibt" eine Ausführungsschleife in einem Ereignishandler, bis dieser Ereignishandler zurückgekehrt ist. Sie können dies in jeder App einfach genug sehen. Installieren Sie einen Handler für jede E / A-Aktion (z. B. Tastendruck), die sich im Ruhezustand befindet. Sie blockieren die Hauptlaufschleife (und die gesamte Benutzeroberfläche), bis diese Methode abgeschlossen ist.
Gleiches gilt für jede Run-Schleife.
Ich schlage vor, Sie lesen die folgende Dokumentation zu Run-Loops:
https://developer.apple.com/documentation/foundation/nsrunloop
und wie sie in Threads verwendet werden:
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1