Warten Sie, bis alle Operationen in der Warteschlange zu beenden, vor der Durchführung der Aufgabe
Ich habe Unterklasse eine Operation und Operation queue mit maxConcurrentOperationCount = 1.
Dieser führt meine Operationen in einer Reihenfolge, die ich hinzufügen, Sie ist gut, aber jetzt muss ich warten, bis alle Vorgänge beendet haben, vor der Ausführung von einem anderen Prozess verwendet.
ich habe versucht, verwenden Sie notification Gruppe, sondern als dies ist die Ausführung in einer for-Schleife, sobald die Operationen wurden Hinzugefügt, um die Warteschlange der benachrichtigungsgruppe feuert.. Wie muss ich warten, bis alle Operationen zum verlassen der Warteschlange vor der Ausführung von einem anderen Prozess?
for (index, _) in self.packArray.enumerated() {
myGroup.enter()
let myArrayOperation = ArrayOperation(collection: self.outerCollectionView, id: self.packArray[index].id, count: index)
myArrayOperation.name = self.packArray[index].id
downloadQueue.addOperation(myArrayOperation)
myGroup.leave()
}
myGroup.notify(queue: .main) {
//do stuff here
}
- Setzen Sie die
myGroup.leave()
im Abschluss-block für den Betrieb. - Verwenden waitUntilAllOperationsAreFinished developer.apple.com/reference/foundation/operationqueue/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie den Betrieb Abhängigkeiten zu initiieren, die eine operation nach der Fertigstellung einer Reihe von anderen Operationen:
completionOperation
noch vorzeitig entlassen. Meine Operationen sind asynchrone Netzwerk-Operationen, so eine operation ist nur alsfinished
wenn die Antwort zurück kommt. Ich habe gelesen, dass ich außer Kraft setzen müssenisAsynchronous
Eigenschaft unter ein paar andere zu machen, eine asynchrone operation, aber ich habe gelesen, dass die Eigenschaft wird ignoriert, wenn ich den Vorgang in eine Warteschlange sowieso. Also ich bin verwirrt, was zu tun ist. Könnten Sie bitte weiter beraten?isAsynchronous
: Es ist wahr, dassisAsynchronous
wird ignoriert, wenn das hinzufügen einer Warteschlange, aber alleisExecuting
,isFinished
und die damit verbundenen KVO ist erforderlich, wenn das hinzufügen von Operationen, wickeln Sie einige asynchrone Prozess in eine Warteschlange. Trotzdem, ich glaube, es ist die beste Praxis zu setzenisAsynchronous
zutrue
wenn der Betrieb, in der Tat, asynchron, (a) spiegeln die Realität der operation und (b) um sicherzustellen, dass es funktioniert, ob es verwendet wird, in einer Warteschlange oder nur manuell gestartet werden.Einer geeigneten Lösung KVO
Ersten, bevor Sie der Schleife hinzufügen der Beobachter (vorausgesetzt
queue
ist dieOperationQueue
Instanz)Dann implementieren
Edit:
In der Swift 4 ist es viel einfacher
Deklarieren einer Eigenschaft:
und erstellen die Beobachter
Ich die nächste Lösung:
Legen Sie die maximale Anzahl von gleichzeitigen Operationen zu 1
dann jeder operation ausgeführt wird, um (als wenn jeder war abhängig von der vorherigen) und Ihre Abschluss-operation ausgeführt wird, am Ende.
Code an das Ende der Warteschlange
finden Sie dieser link
NSOperation und NSOperationQueue sind toll und nützlich, Foundation framework tools für asynchrone Aufgaben. Eine Sache verwirrt mich allerdings: Wie kann ich den code auszuführen, nachdem alle meine queue-Operationen beenden? Die Antwort ist ganz einfach: verwenden Sie die Abhängigkeiten zwischen den Operationen in der Warteschlange (einzigartiges feature von NSOperation). Es ist nur 5 code-Zeilen-Lösung.
NSOperation Abhängigkeit trick
mit Swift ist es nur einfach zu implementieren, wie diese:
Meine Lösung ist ähnlich der von https://stackoverflow.com/a/42496559/452115, aber ich weiß nicht, fügen Sie die
completionOperation
im main OperationQueue aber in die queue selbst. Dies funktioniert für mich: