Was ist der grundlegende Unterschied zwischen NSTimer, NSTask, NSThread und NSRunloop?
Was ist der Unterschied zwischen NSTimer
NSTask
NSThread
und NSRunloop
und gibt es eine Richtlinie, Wann jeder von Ihnen?
InformationsquelleAutor der Frage Ram | 2009-07-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Jedes Programm läuft in mindestens einem thread. Denken kann jeder thread in einem eigenen Prozess, der Programm-Ausführung, die jeweils parallel zu den anderen.
Wenn Sie irgendeine Art von Benutzeroberfläche, oder andere Codes, die Bedürfnisse zu hören, um Veranstaltungen (wie Netzwerk-ports) benötigen Sie ein run loop. Jeder NSThread automatisch bekommt seine eigene Schlinge, und Sie sehr selten haben Sie sich mit Ihnen direkt. Die Schlinge ist auch verantwortlich für das erstellen und die Freigabe autorelease pools.
[EDIT: Siehe Anmerkungen für die weitere Diskussion über autorelease pools. Der wichtigste Punkt im Auge zu behalten ist, dass neue threads kümmern muss, ein autorelease pool. Zum Beispiel Methoden, die aufgerufen werden, mit detachNewThreadSelector (siehe unten) sollte die folgenden, als deren erste und Letzte Zeilen:
Das gleiche gilt für threads hervorgebracht hat, mit anderen Techniken.]
In der Haupt-threadin dem alle UI-handling statt, die Schlinge ist sehr wichtig, da es hält die Oberfläche reaktiv. Das ist, warum Sie sollten nie code ausgeführt werden, das ist zeitaufwendig, auf dem Haupt-thread: es wird Essen, bis die alle mal auf den thread und die Schlinge wird nicht erlaubt, Häufig genug ausgeführt, was sich in einem verschlossenen oder langsame Schnittstelle. Wenn Sie brauchen, um zeitraubende Berechnungen, oder halten Sie eine Aufgabe, die im hintergrund ausgeführt werden soll, erstellen Sie einen neuen thread. Wieder, werden Sie wahrscheinlich nicht haben, zu denken, über die neue Schlinge entsteht. Eine einfache Möglichkeit der Ausführung einer Methode in einem neuen thread:
Inter-thread-Kommunikation kann schwierig sein, und Sie sollten sich bewusst sein, die Methoden
performSelector:onThread:withObject:waitUntilDone:
undperformSelectorOnMainThread:withObject:waitUntilDone:
(Tolle Tipps auf senden NSNotifications über threads hier.)
Timer werden auch behandelt von run-Schleifen. Im Gegensatz zu laufen, Schlingen, sind Sie wahrscheinlich zu oft benutzen der Timer direkt in Ihrem Programm. Die sehr einfachste Weg der Erstellung einer timer:
aber manchmal möchten Sie zum erstellen und verwalten von NSTimer Objekte selbst, zum Beispiel in der Lage sein, um abzubrechen und re-verwenden Sie einen timer.
Einer NSTask verwendet wird, führen Sie ein anderes Programm als Unterprozess von dem aktuellen. Es ist ein bisschen ähnlich wie die Gründung einer separaten thread, aber wenn ein Teilprozess abstürzt, ist dein main-Programm läuft weiter. Die Kommunikation zwischen Programmen ist auch sehr unterschiedlich von der Kommunikation zwischen mehreren threads im gleichen Prozess.
Sie hat Ihre Frage mit "iphone", und auf dem iPhone werden Sie nie mit NSTasks.
NSOperations werden verwendet, wenn Sie behandeln müssen, eine größere Menge an verschiedenen Aufgaben, indem Sie in Warteschlangen und/oder Verarbeitung in separaten threads (obwohl Sie nicht haben laufen in separaten threads). Wenn Ihre Anwendung zu erstellen, die nur ein paar spezielle threads, dann gibt es keinen Grund, die NSOperation Klasse. Aber wenn Sie routinemäßig generieren von Aufgaben (wie die Kommunikation mit einem server), die aufbewahrt werden müssen, Spur, NSOperation und NSOperationQueue in handliches kommen.
InformationsquelleAutor der Antwort Felixyz
NSTimer
ist ein timer-Objekt, eine Möglichkeit zum aufrufen einer Auswahl auf ein Objekt in der Zukunft.NSThread
ist eine thread-Klasse. Ich nehme an, Sie wissen, was ein thread ist.NSTask
ist eine Klasse Prozess, ein Weg, um ein anderes Programm ausführen aus Ihrem Programm.NSOperation
(Ich bin das hinzufügen, um die Frage) ist eine sehr schöne Abstraktion für eine einzelne Aufgabe. Binden Sie den Betrieb in dieser Klasse und man kann Sie problemlos parallel ausgeführt werden, durch eineNSOperationQueue
Klasse.NSRunLoop
ist am schwierigsten zu verstehen. In gewisser Weise abstrahiert und passt dieselect()
unix-system-Aufruf, die Verwaltung input-Quellen und-dispatching events und Timer in einem thread.Der Leitlinie ist die Apple-Threading Programming Guide.
InformationsquelleAutor der Antwort IlDan
Die anderen, Antworten machen einen ziemlich guten job der Zusammenfassung Timer, tasks und threads. Ich wollte anmerken, ein bisschen mehr über die NSRunloop, wie ich denke, die meisten anderen Antworten lassen noch einige Verwirrung hier. Aus der NSRunloop Dokumentation:
auch
Denke, der NSRunloop als Haupt-Ereignis-Verarbeitung und-dispatching-Schleife für einen bestimmten thread. Es liest von der Eingabe-Geräte, Dienstleistungen der alle Objekte, die gewartet werden müssen, und sendet die Daten entsprechend.
InformationsquelleAutor der Antwort Lounges