Tutte le code DISPATCH_QUEUE_PRIORITY_X sono code simultanee (nel senso che possono eseguire più attività contemporaneamente) e sono FIFO nel senso che le attività all'interno di una determinata coda inizieranno a essere eseguite usando l'ordine "first in, first out". Questo è rispetto alla coda principale (da dispatch_get_main_queue ()), che è una coda seriale (le attività inizieranno l'esecuzione e finiranno l'esecuzione nell'ordine in cui vengono ricevute).
Pertanto, se si inviano 1000 blocchi dispatch_async () a DISPATCH_QUEUE_PRIORITY_DEFAULT, tali attività inizieranno a essere eseguite nell'ordine in cui sono state inviate nella coda. Allo stesso modo per le code HIGH, LOW e BACKGROUND. Tutto ciò che invii in una di queste code viene eseguito in background su thread alternativi, lontano dal thread dell'applicazione principale. Pertanto, queste code sono adatte per eseguire attività come download in background, compressione, calcolo, ecc.
Si noti che l'ordine di esecuzione è FIFO in base alla coda. Quindi, se invii 1000 attività dispatch_async () alle quattro diverse code simultanee, suddividendole uniformemente e inviandole a BACKGROUND, LOW, DEFAULT e HIGH in ordine (cioè pianifichi le ultime 250 attività sulla coda HIGH), è molto probabile che le prime attività che vedi avviarsi saranno su quella coda ALTA poiché il sistema ha preso la tua implicazione che tali attività devono arrivare alla CPU il più rapidamente possibile.
Nota anche che dico "inizierà l'esecuzione in ordine", ma tieni presente che, come code simultanee, le cose non finiranno necessariamente in ordine di esecuzione in base al periodo di tempo per ogni attività.
Secondo Apple:
https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html
Una coda di invio simultanea è utile quando si hanno più attività che possono essere eseguite in parallelo. Una coda concorrente è ancora una coda in quanto consente di accodare le attività in un ordine first-in, first-out; tuttavia, una coda concorrente può rimuovere le attività aggiuntive prima del completamento di qualsiasi attività precedente. Il numero effettivo di attività eseguite da una coda simultanea in un dato momento è variabile e può cambiare in modo dinamico al variare delle condizioni dell'applicazione. Numerosi fattori influenzano il numero di attività eseguite dalle code simultanee, incluso il numero di core disponibili, la quantità di lavoro svolto da altri processi e il numero e la priorità delle attività in altre code di invio seriale.
Fondamentalmente, se invii quei 1000 blocchi dispatch_async () a una coda DEFAULT, HIGH, LOW o BACKGROUND, tutti inizieranno l'esecuzione nell'ordine in cui li invii. Tuttavia, le attività più brevi possono terminare prima di quelle più lunghe. I motivi alla base di ciò sono se ci sono core di CPU disponibili o se le attività di coda correnti eseguono un lavoro non intensivo dal punto di vista computazionale (facendo così pensare al sistema di poter inviare attività aggiuntive in parallelo indipendentemente dal numero di core).
Il livello di concorrenza è gestito interamente dal sistema e si basa sul carico del sistema e su altri fattori determinati internamente. Questa è la bellezza di Grand Central Dispatch (il sistema dispatch_async ()): basta creare le unità di lavoro come blocchi di codice, impostare una priorità per esse (in base alla coda scelta) e lasciare che il sistema gestisca il resto.
Quindi, per rispondere alla domanda sopra: sei parzialmente corretto. Stai "chiedendo quel codice" per eseguire attività simultanee su una coda simultanea globale al livello di priorità specificato. Il codice nel blocco verrà eseguito in background e qualsiasi codice aggiuntivo (simile) verrà eseguito potenzialmente in parallelo a seconda della valutazione del sistema delle risorse disponibili.
La coda "principale" invece (da dispatch_get_main_queue ()) è una coda seriale (non concorrente). Le attività inviate alla coda principale verranno sempre eseguite in ordine e finiranno sempre in ordine. Queste attività verranno eseguite anche sul thread dell'interfaccia utente, quindi è adatto per aggiornare l'interfaccia utente con messaggi di avanzamento, notifiche di completamento, ecc.
dispatch_get_global_queue
dentro di te un tipo variabile didispatch_queue_t myQueue
. È più leggibile passare solo myQueue al tuo `` dispatch_async`