Warum sollte ich GCD over NSOperation und Blöcke für High-Level-Anwendungen wählen?
Apples Grand Central Dispatch Referenz sagt:
"...wenn Ihre Anwendung benötigt, um arbeiten auf der Unix-Ebene von der
system—zum Beispiel, wenn es braucht, zum Bearbeiten der Datei-Deskriptoren, Mach
ports, Signale oder Timer. GCD ist nicht beschränkt auf system-Ebene
Anwendungen, aber bevor Sie es verwenden für höher-level-Anwendungen, die Sie
sollte man überlegen, ob eine ähnliche Funktionalität in Kakao (via
NSOperation und block-Objekte) wäre einfacher zu verwenden, oder mehr
für Ihre Anforderungen geeignet ist.".
Kann ich nicht wirklich denke, dass Situationen, die für high-level-Anwendungen, in denen die Verwendung von GCD ist obligatorisch und NSOperation könnte/sollte nicht verwendet werden.
Irgendwelche Gedanken?
InformationsquelleAutor der Frage Lio | 2011-10-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Punkt hier gemacht wird, ist derselbe, Chris Hanson stellt in seinem Artikel "Wann NSOperation vs. GCD":
Im Allgemeinen, ich Stimme mit diesem. NSOperation und NSOperationQueue Unterstützung für Abhängigkeiten und ein oder zwei andere Dinge, die GCD-Blöcke und Warteschlangen nicht haben, und Sie abstrahieren die Low-level details, wie die gleichzeitigen Operationen implementiert sind. Wenn Sie brauchen, dass Funktionalität, NSOperation ist ein sehr guter Weg zu gehen.
Jedoch, nach der Arbeit mit den beiden, die ich gefunden habe, mich austauschen alle meine NSOperation-basierten code mit GCD Blöcke und Warteschlangen. Ich habe dies aus zwei Gründen: es ist zu einem erheblichen Mehraufwand bei der Verwendung von NSOperation für häufige Aktionen, und ich glaube, mein code ist sauberer und Ausführlicher bei der Verwendung von GCD-Blöcke.
Der erste Grund kommt aus der Profilerstellung für meine Anwendungen, wo ich fand, dass die NSOperation Objekt Reservierung und Freigabe-Prozess nahm eine erhebliche Menge an CPU-Ressourcen, wenn es sich um kleine und häufige Aktionen, wie die Bereitstellung eines OpenGL ES-Rahmen um den Bildschirm. GCD-Blöcke vollständig eliminiert, overhead, was zu erheblichen performance-Verbesserungen.
Der zweite Grund ist mehr subjektiv, aber ich glaube, dass mein code ist sauberer als unter Verwendung der Blöcke als NSOperations. Die schnelle Erfassung von Umfang zulässig, indem Sie einen block und die inline-Art davon stellen Sie für weniger code, da brauchen Sie nicht zum erstellen von benutzerdefinierten NSOperation Unterklassen oder Bündel bis zu übergebenden Parameter in der operation, und mehr beschreibenden code, meiner Meinung nach, denn Sie können den code zur Ausführung in einer Warteschlange an der Stelle, wo es abgefeuert.
Wieder, das ist eine Frage der Präferenz, aber ich habe mich selbst gefunden mit GCD mehr, selbst in sonst eher abstrahiert Cocoa-Anwendungen.
InformationsquelleAutor der Antwort Brad Larson
GCD ist eine leichte Methode zur Darstellung von Einheiten von Arbeit, die parallel ausgeführt werden. Sie nicht planen, diese Einheiten zu arbeiten; das system übernimmt die Terminplanung für Sie. Hinzufügen von Abhängigkeiten zwischen Blöcken können Kopfschmerzen. Die Stornierung oder Aussetzung eines block schafft zusätzliche Arbeit für Sie als Entwickler!
NSOperation und NSOperationQueue fügen Sie ein wenig zusätzlichen overhead im Vergleich zu GCD, aber Sie können fügen Sie Abhängigkeiten zwischen verschiedenen Operationen. Sie können wieder zu verwenden, zu annullieren oder zu stornieren Operationen. NSOperation ist kompatibel mit Schlüssel-Wert-Erfassung (KVO); zum Beispiel, können Sie eine NSOperation mit dem laufen beginnen durch das hören auf NSNotificationCenter.
Ausführliche Erklärung, siehe diese Frage: NSOperation vs Grand Central Dispatch
InformationsquelleAutor der Antwort Nitesh Borad
Gut, NSOperation hat keine Entsprechungen zu dispatch_source_t, dispatch_io, dispatch_data_t, dispatch_semaphore_t, etc... Es ist auch etwas höhere Aufwand.
Auf der anderen Seite, libdispatch keine äquivalenten Betrieb zu Abhängigkeiten, Betriebs-Prioritäten (queue-Prioritäten sind etwas anders), oder KVO auf Operationen.
InformationsquelleAutor der Antwort Catfish_Man
Gibt es zwei Dinge, die NSOperationQueue tun können, dass GCD nicht: Der Minderjährige ist eine von Abhängigkeiten (hinzufügen einer operation in eine Warteschlange aber sagen, dass es nur ausgeführt wird, wenn bestimmte andere Operationen abgeschlossen sind), und die big one ist, dass NSOperation gibt Sie ein Objekt, das Nachrichten empfangen kann, während die Aufgabe ausgeführt wird, im Gegensatz zu GCD hat blockiert, können keine Nachrichten empfangen werden, außer in einer sehr begrenzten Art und Weise. Sie müssen entweder diese beiden Merkmale, oder nicht. Wenn Sie nicht mit GCD ist nur sehr viel leichter zu bedienen.
Deshalb nützlich, Beispiele von NSOperation sind immer Recht Komplex. Wenn Sie waren einfach, verwenden Sie GCD statt. In der Regel erstellen Sie eine Subklasse von NSOperation, eine erhebliche Menge an Arbeit, oder verwenden Sie eine, die jemand anderes erstellt hat.
InformationsquelleAutor der Antwort gnasher729
Habe ich eigentlich nur gelesen, um über diese, und ich bin sicher, es wird kommen, wie wissen, überraschung, unterscheiden sich die Meinungen.
Ich kann nicht denken Sie an einen Fall, wo würden Sie verwenden, GCD über NSOperation, aber das bedeutet nicht, dass ein solcher Fall nicht vorhanden ist. Ich jedoch einverstanden mit einer Allgemeinen Stimmung in Bezug auf best-practice-Codierung:
Wenn du ein paar tools, die entsprechend der Aufgabe (und in diesem Fall haben Sie NSOperation gegen einen GCD block), verwenden Sie die Klasse mit der höchsten Ebene der Abstraktion (dh dem höchsten level-API). Nicht nur ist es in der Regel einfacher zu bedienen/weniger code, Sie erhalten auch potenzielle zukünftige Verbesserungen eingeführt, um die höheren level-APIs.
InformationsquelleAutor der Antwort isaac