Wie man halt den aktuell ausgeführten NSOperation?
Gibt es ein äquivalent zu [NSOperationQueue currentQueue]
oder [NSThread currentThread]
für NSOperation
?
Ich habe eine ziemlich komplexe Domänen-Modell, bei dem die schwere Verarbeitung passiert, ganz tief unten im Aufruf-stack. Um rechtzeitige Abbrechen eines Vorgangs würde ich brauchen, um passieren die NSOperation
als parameter an jede Methode, bis ich auf den Punkt kommen, wo ich will, unterbricht eine länger laufende Schleife. Die Verwendung von threads, die ich verwenden könnte [[NSThread currentThread] isCancelled]
so würde es scheinen praktisch, wenn es eine gleichwertige für die NSOperation, leider gibt es nur die scheinbar nutzlos [NSOperationQueue currentQueue]
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kam mit einer Erweiterung in swift gibt, die den Laufenden Betrieb
Dann können Sie pick-up die erste
Nein, es gibt keine Methode, um die aktuell ausgeführte operation.
Zwei Möglichkeiten, um Ihr problem zu lösen:
Operationen sind Objekte. Wenn Sie brauchen, Ein Objekt zu sprechen, Objekt B, müssen Sie vereinbaren, um eine Referenz zu B. Es gibt viele Wege, das zu tun. Eine Möglichkeit ist die übergabe der operation zusammen, um jedes Objekt, das informiert werden muss es. Ein weiteres ist die Verwendung von delegation. Eine Dritte zu machen, ist der Betrieb Teil eines größeren "Kontext" übergeben Sie entlang zu jeder Methode oder Funktion. Wenn Sie feststellen, dass Sie brauchen, um passieren eine Referenz von einem Objekt durch mehrere andere, nur um es auf das Objekt, welches schließlich benutzen Sie es, um einen Hinweis, sollten Sie sich Gedanken über die Neuordnung Ihre code.
Habe die "schwerarbeit" - Methode wieder etwas Wert übergeben bekommt Sie den Ruf der Kette. Sie benötigen nicht unbedingt die heavy-lifting-Methode aufrufen
[currentOperation cancel]
um Ihr Ziel zu erreichen. In der Tat, es wäre besser, Sie haben wieder etwas Wert, dass der Vorgang zu verstehen, zu verstehen, "die Arbeit ist getan, jetzt aufzuhören," weil Sie es können, der Rückgabewert und die Ausfahrt sofort, anstatt zu rufen-isCancelled
einmal in eine Weile, um herauszufinden, ob es storniert wurde.Dies ist nicht eine gute Idee. Operationen sind in der Regel abgebrochen, indem Sie Ihre Warteschlange. Innerhalb der operation main () - Methode können Sie in regelmäßigen Abständen überprüfen, wenn selbst gekündigt wird (sagen wir, alle n Durchläufe einer Schleife, oder am Anfang jeder großen block von Befehlen) und Abbruch wenn dem so ist.
Zu reagieren, um eine Stornierung (sagen wir, einige UI-Elemente gebunden, die auf den Betrieb oder queue-status) verwenden Sie key-value-observing (KVO) haben Ihre controller beachten Sie die Operationen " gestartet, abgeschlossen, abgebrochen Eigenschaften (wie benötigt), dann legen Sie Ihre UI-state (immer auf dem Haupt-thread), wenn diese Schlüssel werden aktualisiert. Pro JeremyP Kommentare, es ist wichtig zu beachten, dass die KVO-Meldungen kommen aus dem op-thread und UI-sollte (fast) immer manipuliert werden, auf die main thread, also müssen Sie Sie verwenden -performSelectorOnMainThread... Methoden zur Aktualisierung Ihres eigentlichen UI, wenn Sie Sie empfangen einen Zustand zu ändern, KVO Hinweis über Ihre Operationen.
Was sind Sie wirklich versuchen, zu tun? Das ist, warum fühlst du dich anderen teilen von Ihrer app wissen müssen direkt über den aktuellen Betrieb?
isCancelled
Flagge. Kein Betrag der KVO magic wird eine operation stoppen, die läuft in einer Schleife nie überprüfenisCancelled
.Könnten Sie speichern den aktuellen Vorgang in der thread-Wörterbuch. Denken Sie nur daran, um es loszuwerden, bevor Sie zu verlassen. Sie können sicher verwenden die thread dict, wenn Sie das Objekt erstellt.
Können Sie eine Kombination von [NSOperationQueue currentQueue] & [NSThread currentThread] um dies zu erreichen.
Im wesentlichen müssen Sie eine Schleife durch die Operationen auf den currentQueue und finden Sie den Betrieb am laufen auf der currentThread.
NSOperation nicht bieten Zugriff auf den thread ausgeführt wird, so dass Sie brauchen, um hinzuzufügen, dass die Immobilie selbst zuweisen.
Sind Sie wahrscheinlich bereits Unterklassen von NSOperation und bietet ein Haupt, so fügen Sie ein 'thread' Eigenschaft mit-Unterklasse:
Dann in Ihrer 'Haupt -' zuweisen, den aktuellen thread zu dieser Eigenschaft
Können Sie fügen Sie dann eine 'currentOperation" - Methode:
Woher wissen Sie, welcher Vorgang, den Sie Abbrechen möchten?
Wenn Sie zu dem Punkt, die Sie stornieren möchten, rufen Sie einfach an [myQueue Operationen] und gehen Sie durch die Vorgänge, bis Sie feststellen, diejenigen, die Sie jetzt kündigen möchten. Ich denke, wenn Sie haben Millionen von Operationen (oder Tausende) das funktioniert möglicherweise nicht.
[myQueue Operationen] ist thread-safe - eine Momentaufnahme von den Queue-Inhalt. Sie können Tauchen bis es ziemlich schnell Abbrechen wird.
Einen anderen Weg:
NSOperationQueue ist nicht ein singleton, so können Sie ein F hat, sagen wir 200 Arbeitsplätze auf es, und dann brechen Sie alle 20 durch gerade, dass Q und löscht Sie alle. Speichern Sie die Q ' s in einem Wörterbuch auf dem main-thread, und dann können Sie die jobs, die Sie wollen, wieder aus dem dict und stornieren Sie alle. also Sie haben 1000 Arten von Operationen, und an die Stelle im code, wo Sie merken, Sie brauchen nicht eine bestimmte Aufgabe, die Sie gerade erhalten die Q für diese Art, und durch Sie für Aufträge zu stornieren.