2013-07-02 7 views
14

Ich lese Apple-Dokumentation zur Verwendung von seriellen Warteschlangen, um sicherzustellen, dass Aufgaben in einer vorhersehbaren Reihenfolge ausgeführt werden, aber jetzt bin ich zu viel verwirrt.
Einige, wie ich in der Lage bin, seriell zu arbeiten, aber immer noch bin ich nicht klar, so brauche ich einfache serielle Beispiel für meine Methoden, um seriell auszuführen.Simple GCD Serial Queue Beispiel wie FIFO mit Blöcken

teilte ich meine Funktionalität in 4 Teile und will sie nun Abwechselnd

[self ReadAllImagesFromPhotosLibrary]; 

[self WriteFewImagestoDirectory]; 

[self GettingBackAllImagesFromFolder]; 

[self MoveToNextView]; 
+0

Wenn Sie mit einer der folgenden Antworten zufrieden sind, markieren Sie sie bitte als richtige Antwort. – Benjamin

Antwort

1

Sie können NSOperationQueue mit maxConcurrentOperationCount auf 1 (oder sogar eingestellte Abhängigkeit für jeden NSOperation, so wird es nicht starten können ausführen bevor seine Abhängigkeit beendet ist).

Hier ist NSOperationQueue Klassenreferenz.

Werfen Sie auch einen Blick auf this Frage.

3

Ich denke der obige Code sollte funktionieren, aber stellen Sie sicher, dass die UI-Operationen im Hauptthread ausgeführt werden. Ich hoffe es hilft.

+0

was? Wie wäre es mit einem Versand async mit 4 Methodenaufrufen? (macht das gleiche) – dcow

+0

Es macht keinen Sinn, die Aufrufe rekursiv zu versenden. Es ist nutzlos Overhead. – Karsten

+0

die "com.unique.name.queue" könnte etwas richtig sein? Warum hast du es so genannt? Was bedeutet ** com **? – Honey

1

Ich bin nicht sehr bewusst der bestehenden API für das gleiche mit Blöcken, wenn überhaupt.

Aber das gleiche kann getan werden, indem Blöcke definiert werden (die die gewünschten Operationen darstellen), so dass sie auf den nächsten Block zeigen, um fortzufahren, falls vorhanden. Außerdem können Sie die gesamte Verarbeitung in eine separate Warteschlange stellen.

Schnipsel Blöcke für mit seriell Ausführung

BLOCK A(NEXT BLOCK reference){ 
->Do the the required Task 
->If(next Block reference) 
--->Then call that block 
->Else 
--->Exit or have a callback on mainthread 
} 
0

warum nicht die GCD versuchen, den Betriebsablauf gewährleistet und hat auch sync und async Fähigkeiten

37

Follow-up und verbessern iCoder Antwort, Sie könnten und sollten Folgendes tun.

dispatch_queue_t serialQueue = dispatch_queue_create("com.unique.name.queue", DISPATCH_QUEUE_SERIAL); 

dispatch_async(serialQueue, ^{ 
     [self ReadAllImagesFromPhotosLibrary]; 
    }); 
dispatch_async(serialQueue, ^{ 
     [self WriteFewImagestoDirectory]; 
}); 
dispatch_async(serialQueue, ^{ 
    [self GettingBackAllImagesFromFolder]; 
}); 
dispatch_async(serialQueue, ^{ 
    [self MoveToNextView]; 
}); 

Trotz der oben Anrufe sind async, werden sie Warteschlange und seriell wie die DISPATCH_QUEUE_SERIAL Staaten laufen. Der Unterschied zwischen sync und async ist, dass mit sync, Ihre Code pausieren und für den Block Antwort wartet, bevor Sie den folgenden Code ausgeführt wird und so möglicherweise das Einfrieren Ihre UI, wenn die Ausführungszeit lang ist. Während mit async der Code läuft und der Block asynchron zurückgegeben wird.

Allerdings sind die Aufgaben, die Sie in der DISPATCH_QUEUE_SERIAL gespeichert werden abwarten und einer nach dem anderen in der Reihenfolge ausgeführt werden, sie hinzugefügt wurden, dank GCD (Grand Central Dispatch).

-1

Ich hatte Erfolg mit einem Muster wie diesem in einer ähnlichen Jagd in Swift 3.0 ...

let serialQueue = DispatchQueue.init(label: "com.foo.bar") 

serialQueue.sync {self.readAllImagesFromPhotosLibrary()} 

serialQueue.sync {self.rriteFewImagestoDirectory()} 

serialQueue.sync {self.gettingBackAllImagesFromFolder()} 

serialQueue.sync {self.moveToNextView()}