Alle DISPATCH_QUEUE_PRIORITY_X-Warteschlangen sind gleichzeitige Warteschlangen (dh sie können mehrere Aufgaben gleichzeitig ausführen) und sind FIFO in dem Sinne, dass Aufgaben in einer bestimmten Warteschlange in der Reihenfolge "first in, first out" ausgeführt werden. Dies ist im Vergleich zur Hauptwarteschlange (von dispatch_get_main_queue ()), bei der es sich um eine serielle Warteschlange handelt (Aufgaben werden in der Reihenfolge ausgeführt und beendet, in der sie empfangen werden).
Wenn Sie also 1000 dispatch_async () -Blöcke an DISPATCH_QUEUE_PRIORITY_DEFAULT senden, werden diese Aufgaben in der Reihenfolge ausgeführt, in der Sie sie in die Warteschlange gestellt haben. Ebenso für die Warteschlangen HIGH, LOW und BACKGROUND. Alles, was Sie in eine dieser Warteschlangen senden, wird im Hintergrund in alternativen Threads außerhalb Ihres Hauptanwendungsthreads ausgeführt. Daher eignen sich diese Warteschlangen zum Ausführen von Aufgaben wie Herunterladen im Hintergrund, Komprimieren, Berechnen usw.
Beachten Sie, dass die Ausführungsreihenfolge FIFO pro Warteschlange ist. Wenn Sie also 1000 dispatch_async () - Aufgaben an die vier verschiedenen gleichzeitigen Warteschlangen senden, diese gleichmäßig aufteilen und in der richtigen Reihenfolge an BACKGROUND, LOW, DEFAULT und HIGH senden (dh Sie planen die letzten 250 Aufgaben in der HIGH-Warteschlange), ist dies sehr wahrscheinlich Die ersten Aufgaben, die beim Starten angezeigt werden, befinden sich in dieser HIGH-Warteschlange, da das System impliziert hat, dass diese Aufgaben so schnell wie möglich zur CPU gelangen müssen.
Beachten Sie auch, dass ich sage "wird in der richtigen Reihenfolge ausgeführt", aber denken Sie daran, dass bei gleichzeitigen Warteschlangen die Ausführung nicht unbedingt in der richtigen Reihenfolge abgeschlossen wird, abhängig von der Zeitdauer für jede Aufgabe.
Laut Apple:
https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html
Eine gleichzeitige Versandwarteschlange ist nützlich, wenn Sie mehrere Aufgaben haben, die parallel ausgeführt werden können. Eine gleichzeitige Warteschlange ist immer noch eine Warteschlange, da sie Aufgaben in einer First-In- und First-Out-Reihenfolge aus der Warteschlange entfernt. Eine gleichzeitige Warteschlange kann jedoch zusätzliche Aufgaben aus der Warteschlange entfernen, bevor frühere Aufgaben abgeschlossen sind. Die tatsächliche Anzahl der Aufgaben, die zu einem bestimmten Zeitpunkt von einer gleichzeitigen Warteschlange ausgeführt werden, ist variabel und kann sich dynamisch ändern, wenn sich die Bedingungen in Ihrer Anwendung ändern. Viele Faktoren beeinflussen die Anzahl der von den gleichzeitigen Warteschlangen ausgeführten Aufgaben, einschließlich der Anzahl der verfügbaren Kerne, des Arbeitsaufwands anderer Prozesse sowie der Anzahl und Priorität der Aufgaben in anderen seriellen Versandwarteschlangen.
Wenn Sie diese 1000 dispatch_async () -Blöcke an eine DEFAULT-, HIGH-, LOW- oder BACKGROUND-Warteschlange senden, werden sie grundsätzlich alle in der Reihenfolge ausgeführt, in der Sie sie senden. Kürzere Aufgaben können jedoch vor längeren erledigt werden. Gründe dafür sind, ob CPU-Kerne verfügbar sind oder ob die aktuellen Warteschlangenaufgaben rechenintensive Arbeit leisten (was das System glauben lässt, dass es unabhängig von der Anzahl der Kerne zusätzliche Aufgaben parallel versenden kann).
Der Grad der Parallelität wird vollständig vom System verwaltet und basiert auf der Systemlast und anderen intern festgelegten Faktoren. Dies ist das Schöne an Grand Central Dispatch (dem System dispatch_async ()): Sie erstellen Ihre Arbeitseinheiten einfach als Codeblöcke, legen eine Priorität für sie fest (basierend auf der von Ihnen ausgewählten Warteschlange) und lassen das System den Rest erledigen.
Um Ihre obige Frage zu beantworten: Sie sind teilweise richtig. Sie "bitten diesen Code", gleichzeitige Aufgaben in einer globalen gleichzeitigen Warteschlange mit der angegebenen Prioritätsstufe auszuführen. Der Code im Block wird im Hintergrund ausgeführt, und jeder zusätzliche (ähnliche) Code wird möglicherweise parallel ausgeführt, abhängig von der Bewertung der verfügbaren Ressourcen durch das System.
Die "Haupt" -Warteschlange hingegen (von dispatch_get_main_queue ()) ist eine serielle Warteschlange (nicht gleichzeitig). Aufgaben, die an die Hauptwarteschlange gesendet werden, werden immer in der richtigen Reihenfolge ausgeführt und immer in der richtigen Reihenfolge beendet. Diese Aufgaben werden auch im UI-Thread ausgeführt, sodass Sie Ihre UI mit Fortschrittsmeldungen, Abschlussbenachrichtigungen usw. aktualisieren können.
dispatch_get_global_queue
Inneres in einem variablen Typ vondispatch_queue_t myQueue
. Es ist besser lesbar, wenn Sie nur myQueue an Ihre `` dispatch_async` übergeben