NSDefaultRunLoopMode vs NSRunLoopCommonModes
Liebe gute Menschen von stackoverflow,
Genau wie das Letzte mal, dass ich hiermit eine Frage, die ich kürzlich stolperte. Ich hoffe jemand da draußen könnte etwas Licht auf mich.
Immer wenn ich versuche zu downloaden eine große Datei, die hinter UIScrollView
MPMapView
oder etwas, der Download-Prozess wird gestoppt, sobald ich den touch-iPhone-Bildschirm. Zum Glück, einen Super blog-post von Jörn schlägt eine alternative, option, mit NSRunLoopCommonModes
für die Verbindung.
Mich holt Blick ins detail der zwei Modi, NSDefaultRunLoopMode und NSRunLoopCommonModes, aber das apple-Dokument nicht freundlich erklären, andere als zu sagen,
NSDefaultRunLoopMode
Den Modus zum Umgang mit input-Quellen andere als NSConnection Objekte.
Dies ist die am häufigsten verwendete run-loop-Modus.
NSRunLoopCommonModes
Objekte, die Hinzugefügt, um einen Lauf-Schleife mit diesem Wert als Modus-überwacht alle loop-Modi, die erklärt wurden, als Mitglied der “common" - Modi; siehe die Beschreibung von CFRunLoopAddCommonMode für details.
CFRunLoopAddCommonMode
Quellen, Timer, und der Beobachter registriert, um eines oder mehrere run-loop-Modi und werden nur ausgeführt, wenn der run-Schleife ausgeführt wird, in einem dieser Modi. Gemeinsame Modi sind eine Reihe von run-loop-Modi, für die Sie festlegen können eine Reihe von Quellen, Timer -, und Beobachter, die geteilt werden durch diese Modi. Anstatt die Registrierung einer Quelle, zum Beispiel, ist für den jeweiligen run loop-Modus, können Sie sich ihn einmal, um die Schlinge gemeinsamen pseudo-Modus und es wird automatisch registriert, die in jedem run loop-Modus in den gemeinsamen Modus eingestellt. Ebenso, wenn ein Modus Hinzugefügt, um die gemeinsamen Modi, alle Quellen, Timer oder Beobachter bereits registriert, um die Allgemeine pseudo-Modus werden Hinzugefügt, um die neu hinzugefügten gemeinsamen Modus.
Kann bitte jemand erklären die beiden in die menschliche Sprache?
InformationsquelleAutor der Frage Stkim1 | 2011-08-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer Schlinge ist ein Mechanismus, der es dem system ermöglicht, zu wecken die schlafenden threads, so dass Sie verwalten asynchrone Ereignisse. Normalerweise, wenn Sie ausführen, ein thread (mit Ausnahme des Haupt-thread) gibt es eine option zum starten der thread in einer Schleife laufen oder nicht. Wenn der Faden läuft einige Sortieren oder langen-Betrieb ohne Interaktion mit externen Ereignissen und ohne Timer, brauchen Sie nicht eine Schlinge, aber wenn dein thread braucht, um zu reagieren auf eingehende Ereignisse, es sollte angefügt werden, um eine Schlinge um aufzuwachen den thread, wenn neue Ereignisse eintreffen. Dies ist der Fall von
NSURLConnection
erzeugten threads, da Sie nur Gefolge auf eingehende Ereignisse (aus dem Netzwerk).Jedem thread zugeordnet werden können, mehrere ausführen Schleifen oder verbunden werden können, um eine bestimmte Schlinge, die festgelegt werden können arbeiten, die in verschiedenen Modi. Ein "run loop-Modus" ist eine Konvention verwendet, die von der OS zu etablieren, einige Regeln für den Zeitpunkt der Lieferung bestimmter Ereignisse oder sammeln Sie Sie später geliefert werden.
In der Regel laufen alle loops werden gesetzt, um die "default-Modus" legt eine Standard-Methode zum verwalten von Eingabe-Ereignissen. Zum Beispiel: sobald eine Maus-ziehen (Mac OS) oder touch (iOS) Ereignis passiert, dann wird der Modus für die run loop gesetzt ist, um Ereignis-tracking; dies bedeutet, dass der thread nicht geweckt werden, auf neuen Netzwerk-Ereignisse diese Ereignisse werden später geliefert werden, wenn der Benutzer die Eingabe-Ereignis beendet und der run loop set to default-Modus wieder aus; offensichtlich ist dies eine Entscheidung der OS Architekten den Vorrang zu geben Benutzer-Ereignisse statt Hintergründe.
Wenn Sie sich entscheiden, ändern Sie die run loop-Modus für Ihre
NSURLConnection
thread, indemscheduleInRunLoop:forModes:
dann können Sie zuweisen, den thread in ein spezielles Lauf-Schleife Modusanstatt die spezifischen default-run loop. Der pseudo-Modus genanntNSRunLoopCommonModes
wird von vielen input-Quellen, einschließlich event-tracking. Zum Beispiel die ZuordnungNSURLConnection
's Beispiel, um die common-mode bedeutet, dass Mitarbeiter Ihre Veranstaltungen auf "tracking-Modus" zusätzlich zu den "Standard-Modus". Ein Vorteil/Nachteil der Verknüpfung von threads mitNSRunLoopCommonModes
ist, dass der thread nicht gesperrt werden touch-events.Neue Modi Hinzugefügt werden können, um die gemeinsame Modi, aber das ist ziemlich low-level-Operationen.
Ich möchte schließen, indem Sie ein paar Hinweise:
In der Regel brauchen wir eine Reihe von Bildern oder
miniaturen aus dem Netz heruntergeladen mit einer Tabelle anzeigen. Wir mögen denken, dass
das herunterladen dieser Bilder aus dem Netz, während die Tabellenansicht ist
scrollen könnte zur Verbesserung der user experience (da konnten wir sehen, die Bilder, die während
scrollen"), dies ist jedoch nicht vorteilhaft, da die Flüssigkeit der
scrollen kann, leiden sehr darunter. In diesem Beispiel mit
NSURLConnection
eine Schlinge sollte nicht verwendet werden; es wäre besser, um dieUIScrollView
delegate-Methoden zu erkennen, wenn das scrollen beendet wird, und aktualisieren Sie dann die Tabelle und laden Sie neue Elementevom Netzwerk;
Können Sie erwägen, GCD, die Ihnen helfen, "shield" Ihren code
von laufen-Schleife-management-Themen. In dem obigen Beispiel, können Sie
erwägen Sie Ihre Netzwerk-Anforderungen an eine benutzerdefinierte serielle queue.
InformationsquelleAutor der Antwort viggio24