Ich tauche ein wenig tiefer in Nebenläufigkeit und habe ausführlich über GCD und NSOperation
gelesen. Allerdings sind viele Beiträge wie die kanonische Antwort auf SO mehrere Jahre alt.
Es schien mir, dass NSOperation
Hauptvorteile waren, auf Kosten einer Leistung :
Gegeben GCD's DispatchWorkItem
& amp; block cancellation / DispatchGroup
/ qos
insbesondere, gibt es wirklich einen Anreiz (kosten- und leistungsmäßig), NSOperation
für den gemeinsamen Zugriff zu verwenden, abgesehen von Fällen, in denen Sie eine Aufgabe abbrechen müssen, wenn sie ausgeführt wurde oder Frage den Aufgabenstatus?
Apple scheint zumindest auf ihrer WWDC (mehr als NSOperation
) viel mehr Wert auf GCD zu legen.
Ich sehe, dass sie immer noch ihren eigenen Zweck haben. Ich habe gerade den WWDC-Bericht 2015 (Advanced NSOperations) darüber neu geschrieben und sehe hier zwei Hauptpunkte.
Laufzeit & amp; Benutzerinteraktion
Aus dem Gespräch:
NSOperationen werden ein wenig länger ausgeführt, als Sie von einem Block erwarten würden. Daher dauert die Ausführung von Blöcken normalerweise einige Nanosekunden, vielleicht höchstens eine Millisekunde.
NSOperations hingegen können viel länger sein, für einen Zeitraum von ein paar Millisekunden bis zu mehreren Minuten
Das Beispiel, über das sie sprechen, befindet sich in der WWDC-App, wo es eine NSOperation gibt, die von einem angemeldeten Benutzer abhängig ist. Die Abhängigkeit NSOperation stellt einen Login-View-Controller dar und wartet auf die Authentifizierung des Benutzers. Sobald diese beendet ist, wird diese NSOperation beendet und die NSOperationQueue setzt ihre Arbeit fort. Ich denke nicht, dass Sie GCD für dieses Szenario verwenden möchten.
Unterklassierung
Da NSOperations nur Klassen sind, können Sie sie untergliedern, um mehr Wiederverwendbarkeit zu erreichen. Dies ist mit GCD nicht möglich.
Beispiel: (Verwenden des WWDC-Anmeldeszenarios von oben)
Sie haben viele NSOperationen in Ihrer Codebasis, die mit einer Benutzerinteraktion verknüpft sind, für die sie authentifiziert werden müssen. (In diesem Beispiel gefällt Ihnen ein Video.) Sie können NSOperation erweitern, um eine AuthenticatedOperation zu erstellen, und anschließend alle diese NSOperations erweitern lassen.
Erstens, NSOperationQueue
lässt Sie Operationen in die Warteschlange stellen, dh eine Art von asynchronen Operationen mit einer start
-Methode, einer cancel
-Methode und einigen beobachtbaren Eigenschaften, während mit a Dispatch-Queue man kann eine block oder eine closure oder eine Funktion an eine Dispatch Queue senden, die dann ausgeführt wird.
Eine "Operation" unterscheidet sich grundlegend grundlegend von einem Block (oder einer Schließung, Funktion). Eine Operation hat eine zugrunde liegende asynchrone Task, während ein Block (Closure oder Funktionen) genau das ist.
Was einem NSOperation
jedoch nahe kommt, ist eine asynchrone Funktion, z. B .:
Jetzt können wir mit Futures die gleiche asynchrone Funktion definieren wie:
%Vor%was solche asynchronen Funktionen ziemlich praktisch macht.
Da Futures Kombinatorfunktionen wie map
und flatMap
usw. haben, können wir das "Abhängigkeits" -Feature von NSOperation
recht einfach "emulieren", nur auf eine leistungsfähigere, prägnantere und verständlichere Art und Weise.
Wir können auch eine Art NSOperationQueue
mit ein paar Codezeilen implementieren, die nur auf GCD basieren, sagen wir eine "TaskQueue" und mit im Prinzip den gleichen Funktionen wie "maxConcurrentTasks" und können damit -Task in die Warteschlange stellen Funktionen (nicht Operationen), nur in einer leistungsfähigeren, prägnanter und verständlicher Weise. ;)
Um einen abbrechbaren Vorgang zu erhalten, müssen Sie eine Unterklasse von NSOperation
erstellen - während Sie eine asynchrone Funktion "ad-hod" - inline erstellen können.
Da cancellation ein unabhängiges Konzept ist, können wir auch davon ausgehen, dass es eine Bibliothek gibt, deren Implementierung ausschließlich auf GCD basiert, die dieses Problem auf die übliche Weise löst;) Es kann so aussehen:
%Vor%und später:
%Vor% Also, IMHO gibt es wirklich keinen Grund, clunky NSOperation
und NSOperationQueue
zu verwenden, und es gibt keinen Grund mehr, subclassing NSOperation
zu erstellen, was ziemlich kompliziert und überraschend schwierig ist, außer du interessierst dich nicht für Datenrennen .
Tags und Links ios grand-central-dispatch nsoperation swift