Quali metodi esistono per inserire i compiti nella coda di Grand Central Dispatch (GCD)?
sobes.tech AI
Risposta dell'AI
Esistono i seguenti modi per inserire i task nella coda GCD:
-
Esecuzione asincrona (async): Il task viene aggiunto alla coda e l'esecuzione continua immediatamente sul thread corrente, senza attendere che il task nella coda termini.
DispatchQueue.global().async { // Codice del task } -
Esecuzione sincrona (sync): Il task viene aggiunto alla coda e il thread corrente si blocca fino al completamento del task. Evita di usare sync sul thread principale per task di lunga durata per non bloccare l'UI.
DispatchQueue.global().sync { // Codice del task, il thread attuale aspetterà } -
Esecuzione differita (asyncAfter): Il task viene aggiunto alla coda con un ritardo specificato. L'esecuzione inizierà non prima del tempo indicato.
DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) { // Il codice del task verrà eseguito tra 2 secondi } -
Esecuzione in gruppo (DispatchGroup): I task possono essere aggiunti a un DispatchGroup per sincronizzare il loro completamento. È possibile attendere che tutti finiscano o ricevere una notifica (notify) dopo il loro completamento.
let group = DispatchGroup() group.enter() DispatchQueue.global().async { // Task 1 group.leave() } group.enter() DispatchQueue.global().async { // Task 2 group.leave() } group.notify(queue: .main) { // Tutti i task nel gruppo sono completati } -
Esecuzione di iterazioni (concurrentPerform): Permette di eseguire un blocco di codice
iterationsvolte in parallelo su una coda concorrente.DispatchQueue.concurrentPerform(iterations: 100) { index in // Codice eseguito per ogni indice in parallelo } -
DispatchWorkItem: Incapsula un blocco di codice e permette di annullare il task prima che inizi o dopo averlo aggiunto alla coda, se non è ancora iniziato.
var workItem: DispatchWorkItem? workItem = DispatchWorkItem { // Codice del task } DispatchQueue.global().async(execute: workItem!) // È possibile annullare il task se non è ancora iniziato // workItem?.cancel()