Eine Ausführungsschleife ist ein Mechanismus, mit dem das System schlafende Threads aktivieren kann, damit sie asynchrone Ereignisse verwalten können. Normalerweise gibt es beim Ausführen eines Threads (mit Ausnahme des Hauptthreads) die Möglichkeit, den Thread in einer Ausführungsschleife zu starten oder nicht. Wenn der Thread eine Art oder einen lang laufenden Vorgang ohne Interaktion mit externen Ereignissen und ohne Zeitgeber ausführt, benötigen Sie keine Ausführungsschleife. Wenn Ihr Thread jedoch auf eingehende Ereignisse reagieren muss, sollte er an eine Ausführungsschleife angehängt werden Wecken Sie den Thread auf, wenn neue Ereignisse eintreffen. Dies ist bei NSURLConnection
generierten Threads der Fall , da sie nur bei eingehenden Ereignissen (aus dem Netzwerk) aktiviert werden.
Jeder Thread kann mehreren Ausführungsschleifen oder einer bestimmten Ausführungsschleife zugeordnet sein, die so eingestellt werden kann, dass sie in verschiedenen Modi funktioniert. Ein "Run-Loop-Modus" ist eine Konvention, die vom Betriebssystem verwendet wird, um einige Regeln für die Zustellung bestimmter Ereignisse festzulegen oder diese zu sammeln, um sie später zu übermitteln.
Normalerweise werden alle Ausführungsschleifen auf den "Standardmodus" gesetzt, der eine Standardmethode zum Verwalten von Eingabeereignissen festlegt. Beispiel: Sobald ein Ereignis zum Ziehen mit der Maus (Mac OS) oder Berühren (unter iOS) auftritt, wird der Modus für diese Ausführungsschleife auf Ereignisverfolgung eingestellt. Dies bedeutet, dass der Thread bei neuen Netzwerkereignissen nicht geweckt wird. Diese Ereignisse werden jedoch später übermittelt, wenn das Benutzereingabeereignis beendet und die Ausführungsschleife wieder in den Standardmodus versetzt wird. Offensichtlich ist dies eine Entscheidung der Betriebssystemarchitekten, Benutzerereignissen anstelle von Hintergrundereignissen Vorrang einzuräumen.
Wenn Sie den Run-Loop-Modus für Ihren NSURLConnection
Thread mithilfe von ändern möchten, scheduleInRunLoop:forModes:
können Sie den Thread einem speziellen Run-Loop- Modus und nicht der spezifischen Standard-Run-Loop zuweisen . Der spezielle aufgerufene Pseudomodus NSRunLoopCommonModes
wird von vielen Eingabequellen einschließlich der Ereignisverfolgung verwendet. Wenn Sie beispielsweise die NSURLConnection
Instanz dem allgemeinen Modus zuweisen , werden die Ereignisse zusätzlich zum "Standardmodus" dem "Verfolgungsmodus" zugeordnet. Ein Vorteil / Nachteil des Zuordnens von Threads NSRunLoopCommonModes
besteht darin, dass der Thread nicht durch Berührungsereignisse blockiert wird.
Zu den allgemeinen Modi können neue Modi hinzugefügt werden, dies ist jedoch eine recht einfache Operation.
Abschließend möchte ich einige Anmerkungen hinzufügen:
Normalerweise müssen wir eine Reihe von Bildern oder Miniaturansichten verwenden, die aus dem Netzwerk mit einer Tabellenansicht heruntergeladen wurden. Wir denken möglicherweise, dass das Herunterladen dieser Bilder aus dem Netzwerk während des Bildlaufs in der Tabellenansicht die Benutzererfahrung verbessern könnte (da wir die Bilder beim Bildlauf sehen könnten), dies ist jedoch nicht vorteilhaft, da die Fließfähigkeit des Bildlaufs stark leiden kann. In diesem Beispiel NSURLConnection
sollte keine Run-Schleife verwendet werden. Es ist besser, die UIScrollView
Delegate-Methoden zu verwenden, um zu erkennen, wann das Scrollen beendet ist, und dann die Tabelle zu aktualisieren und neue Elemente aus dem Netzwerk herunterzuladen.
Sie können die Verwendung von GCD in Betracht ziehen, um Ihren Code vor Problemen mit der Verwaltung von Ausführungsschleifen zu schützen. Im obigen Beispiel können Sie Ihre Netzwerkanforderungen zu einer benutzerdefinierten seriellen Warteschlange hinzufügen.
NSRunLoopCommonModes
Ermöglicht Timer-Ereignisse beim ScrollenUIScrollView
.NSDefaultRunLoopMode
Timer beim Scrollen verhindern.