2017-02-14 2 views
3

https://developer.apple.com/reference/foundation/operation Bezug, ich bin mit Spielplatz Setup als -Legendes Folge von Operationen mit Abhängigkeit in Swift

class myOperation1 : Operation { 
    override func main() { 
     print("op1 working....") 
    } 
} 

class myOperation2 : Operation { 
    override func main() { 
     print("op2 working....") 
    } 
} 

let op1 = myOperation1() 
let op2 = myOperation2() 

op1.completionBlock = { 
    print("op1 finished") 
} 

op2.completionBlock = { 
    print("op2 finished") 
} 

op2.addDependency(op1) 

let opsQue = OperationQueue() 
opsQue.addOperation(op1) 
opsQue.addOperation(op2) 

Und Konsolenprotokoll ist -

op1 working.... 
op2 working.... 
op1 finished 
op2 finished 

Sollten wir nicht ausgegeben als Folge der Abhängigkeit erwarten ? -

op1 working.... 
op1 finished 
op2 working.... 
op2 finished 

Gleiches Ergebnis bei der Verwendung - opsQue.addOperations([op1, op2], waitUntilFinished: true)

op1 working.... 
op2 working.... 
op1 finished 
op2 finished 
+1

Um Code-Reihenfolge zu vermeiden, können Sie 'opsQue verwenden.addOperations ([op1, op2], waitUntilFinished: true) ' – WeiJay

+0

und versuchen, mit Abhängigkeit und ohne – WeiJay

+0

@WeiJay Abhängigkeit: Vielleicht sollte ich dieses Verhalten nicht in Spielplatz beobachten, ist es im aktuellen Projekt sollte – BaSha

Antwort

2

In der Tat ich kann nicht feststellen, was genau das Geheimnis, warum Ihr Code nicht, wie es sollte nicht funktionieren, aber ich heraus 3 Abhilfen zu erreichen, was Sie versuchen, zu:

Wenn Sie erwarten, dass die Ausgabe sollte immer sein:

op1 working.... 
op1 finished 
op2 working.... 
op2 finished 

dann:

1- Man könnte die zweite Operation an die Warteschlange im Block Beendigung des ersten hinzugefügt werden soll, wie folgt:

class myOperation1 : Operation { 
    override func main() { 
     print("op1 working....") 
    } 
} 

class myOperation2 : Operation { 
    override func main() { 
     print("op2 working....") 
    } 
} 

let opsQue = OperationQueue() 

let op1 = myOperation1() 

op1.completionBlock = { 
    print("op1 finished") 

    opsQue.addOperation(op2) 
} 

let op2 = myOperation2() 

op2.completionBlock = { 
    print("op2 finished") 
} 

opsQue.addOperation(op1) 

2- Rahmen maxConcurrentOperationCount Operations-Warteschlange auf 1, wie folgt:

class myOperation1 : Operation { 
    override func main() { 
     print("op1 working....") 
    } 
} 

class myOperation2 : Operation { 
    override func main() { 
     print("op2 working....") 
    } 
} 

let op1 = myOperation1() 
let op2 = myOperation2() 

op1.completionBlock = { 
    print("op1 finished") 
} 

op2.completionBlock = { 
    print("op2 finished") 
} 

op2.addDependency(op1) 

let opsQue = OperationQueue() 
// setting maxConcurrentOperationCount to 1 
opsQue.maxConcurrentOperationCount = 1 
opsQue.addOperation(op1) 
opsQue.addOperation(op2) 

3- Aufruf waitUntilAllOperationsAreFinished() nach der ersten Operation an die Warteschlange hinzufügen, wie folgt:

let opsQue = OperationQueue() 
opsQue.addOperation(op1) 
opsQue.waitUntilAllOperationsAreFinished() 
opsQue.addOperation(op2) 

btw, für eine nicht-komplexe Aufgabe, ziehe ich GCDS zu verwenden.

Hoffe das half.

0

Durch die Abhängigkeit spezifiziert, wird sichergestellt, dass op2 nach op1 abgeschlossen ist geplant wird, aber nicht unbedingt, dass op2 nachdem der Abschluss-Handler von op1 fertig geplant wird.

+0

ich denke Aussage widerspricht - der Empfänger ist nicht bereit betrachtet auszuführen, bis alle abhängigen Operationen beendet haben Ausführung (https://developer.apple.com/reference/foundation/operation/1412859-adddependency) – BaSha

+0

@BaSha: was meinst du? Wo siehst du einen Widerspruch? 'addDependency' fügt eine Abhängigkeit von der Operation hinzu, nicht vom Completion-Handler ... – Tali

0

Initialisierung der OperationQueue suspended wird Ihnen geben, was Sie wollen.

let queue = OperationQueue() 
let downloadOp = Operation() 
let resizeOp = Operation() 
downloadOp.dependency(resizeOp) 
queue.isSuspended = true 
queue.addOperation(downloadOp) 
queue.addOperation(resizeOp) 
queue.isSuspended = false