Gleichzeitige vs serielle Warteschlangen in GCD
Ich habe Mühe, zu verstehen, die die gleichzeitige und serielle Warteschlangen in den GCD. Ich habe einige Fragen und hoffe jemand kann mir Antworten, klar und auf den Punkt.
- Bin ich beim Lesen, dass die Serien-queues erstellt und verwendet werden, um die Aufgaben ausführen, die einer nach dem anderen. Was aber geschieht, wenn:
- Ich eine serielle queue
- Ich benutze
dispatch_async
(auf der seriellen queue, das ich erstellt habe) drei mal, um den Versand die drei Blöcke A,B,C
Werden die drei Blöcke werden ausgeführt:
- in der Reihenfolge A,B,C, weil die Warteschlange serielle
ODER
- gleichzeitig (in der gleichen Zeit auf parralel threads), weil ich früher ASYNC Versand
- Bin ich beim Lesen, dass ich
dispatch_sync
auf concurrent queues, um auszuführen Blöcke eins nach dem anderen. In diesem Fall ist, WARUM serielle Warteschlangen sind auch vorhanden, da kann ich immer mit einem gleichzeitigen Warteschlange, wo kann ich dispatch SYNCHRON wie viele Blöcke, wie ich will?Vielen Dank für die gute Erklärung!
Kommentar zu dem Problem
Eine einfache gute Voraussetzung Frage Versand-sync vs. async
InformationsquelleAutor der Frage Bogdan Alexandru | 2013-10-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein einfaches Beispiel: Sie haben einen block, der innerhalb einer minute ausführen. Fügen Sie es zu einem queue aus dem Haupt-thread. Schauen wir uns die vier Fälle.
Offensichtlich Sie würde nicht verwenden Sie entweder die letzten beiden für lang laufende Prozesse. Sie normalerweise sehen, wenn Sie versuchen, aktualisieren der Benutzeroberfläche (immer auf dem Haupt-thread) von etwas, die möglicherweise ausgeführt werden, auf einem anderen thread.
InformationsquelleAutor der Antwort Stephen Darlington
Hier sind ein paar Experimente, die ich getan habe, um mich zu verstehen, über diese
serial
,concurrent
Warteschlangen mitGrand Central Dispatch
.Hier ist eine Zusammenfassung dieser Experimente
Erinnere mich, mit GCD Sie sind nur das hinzufügen von tasks an die Warteschlange und darstellende Aufgabe aus der Warteschlange. Die Warteschlange löst Ihre Aufgabe entweder im Haupt-oder hintergrund-thread, je nachdem, ob die operation synchron oder asynchron. Arten von queues Seriell,Parallel,Main dispatch queue.Alle Aufgabe, die Sie ausführen, geschieht durch die Vorgabe von Main dispatch queue.Es gibt bereits vier vordefinierte Globale concurrent queues für Ihre Anwendung zu verwenden und eine Haupt-Warteschlange(DispatchQueue.main).Sie können auch manuell erstellen Sie Ihre eigene Warteschlange und führen Sie die Aufgabe aus der Warteschlange.
UI Related task sollte immer durchgeführt werden, von der main-thread durch die Entsendung der task Main queue.Kurzer hand Dienstprogramm ist
DispatchQueue.main.sync/async
in der Erwägung, dass-Netzwerk Zusammenhang/schwere Operationen sollte immer durchgeführt werden, asynchron, keine Fragen, denen je ein Faden, den Sie entweder Haupt-oder hintergrundBEARBEITEN:
Es gibt jedoch Fälle, die Sie durchführen müssen Netzwerk ruft die Operationen synchron in einem hintergrund-thread, ohne zu frieren-UI (- e.g.erfrischend OAuth-Token und warten, ob es gelingt oder nicht).Sie brauchen, um die wrap-Methode, die innerhalb einen asynchronen Betrieb.Auf diese Weise Ihre schwere Operationen in der Reihenfolge ausgeführt werden und ohne Sperrung Haupt-thread.
EDIT EDIT: Sie können beobachten Sie das demo-video hier
InformationsquelleAutor der Antwort
Wenn ich das richtig verstehe darum, wie GCD funktioniert, ich denke, es gibt zwei Arten von
DispatchQueue
,serial
undconcurrent
zur gleichen Zeit, es gibt zwei Wege, wieDispatchQueue
Versand Ihre Aufgaben, die zugewiesenclosure
, erste istasync
ist, und der anderesync
. Diese zusammen legt fest, wie der Verschluss (Aufgabe) tatsächlich ausgeführt wird.Fand ich, dass
serial
undconcurrent
meine, wie viele threads, die die Warteschlange verwenden, könnenserial
bedeutet, in der Erwägung, dassconcurrent
bedeutet viele. Undsync
undasync
bedeuten die Aufgabe wird ausgeführt, auf welchem thread der caller-thread oder dem thread zugrunde liegenden, Warteschlangesync
steht laufen auf Aufrufer-thread in der Erwägung, dassasync
bedeutet der run auf die zugrunde liegenden thread.Den folgenden experimentellen code, der ausgeführt werden kann, die auf Xcode Spielplatz.
Hoffe, dass es hilfreich sein kann.
InformationsquelleAutor der Antwort Keith