2017 / Swift 3.1 - GCD vs NSOperation

8

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 :

  • "der Weg zu gehen" im Allgemeinen für mehr als eine einfache Aufgabe als die höchste Abstraktion (auf GCD aufgebaut)
  • um Aufgabenmanipulation (Abbruch, etc.) viel einfacher zu machen
  • zum einfachen Einrichten von Abhängigkeiten zwischen Aufgaben

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.

    
Herakleis 05.04.2017, 08:56
quelle

2 Antworten

4

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.

    
Stephen 21.04.2017, 17:39
quelle
1

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 .:

%Vor%

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 .

    
CouchDeveloper 13.05.2017 18:46
quelle