Middle
Quali strumenti sono disponibili in Grand Central Dispatch (GCD)?
sobes.tech AI
Risposta dell'AI
Strumenti principali di GCD:
- Code di dispatch (Dispatch Queues): Gestiscono l'esecuzione di blocchi di codice. Possono essere:
- Sequenziali (Serial): Eseguono i compiti uno alla volta, garantendo l'ordine.
- Concorrenti (Concurrent): Eseguono i compiti contemporaneamente (entro le risorse di sistema disponibili).
- Code concorrenti globali (Global Concurrent Queues): Fornite dal sistema, hanno priorità predefinite (classi di qualità del servizio - QoS).
- Coda principale (Main Queue): Una coda sequenziale speciale collegata al thread principale dell'applicazione. Usata per lavorare con l'UI.
- Gruppi di dispatch (Dispatch Groups): Permettono di monitorare il completamento di un insieme di compiti asincroni.
- Semantica di barriera (Barrier Semantics): Per le code concorrenti, permette di creare una "barriera" dopo la quale vengono eseguiti solo i compiti posti dopo la barriera, fino a che questa non viene superata.
- Fonti di dispatch (Dispatch Sources): Permettono di rispondere a eventi di sistema (operazioni sui file, segnali, timer, ecc.).
- DispatchWorkItem: Incapsula un blocco di codice e può essere inviato a una coda, annullato e notificato al termine.
Esempio di creazione di una coda sequenziale e di esecuzione di un compito:
let serialQueue = DispatchQueue(label: "com.example.serialQueue")
serialQueue.async {
// Eseguito in modo asincrono nella coda sequenziale
print("Compito eseguito nella coda sequenziale")
}
Esempio di utilizzo di un gruppo di dispatch:
let group = DispatchGroup()
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
group.enter() // Entrare nel gruppo
concurrentQueue.async {
// Compito 1
print("Compito 1 completato")
group.leave() // Uscire dal gruppo
}
group.enter() // Entrare nel gruppo
concurrentQueue.async {
// Compito 2
print("Compito 2 completato")
group.leave() // Uscire dal gruppo
}
group.notify(queue: .main) {
// Esegue dopo che tutti i compiti nel gruppo sono stati completati
print("Tutti i compiti nel gruppo sono stati completati")
}
Esempio di utilizzo di DispatchWorkItem:
let workItem = DispatchWorkItem {
print("WorkItem eseguito")
}
DispatchQueue.global().async(execute: workItem)
// workItem.cancel() // Può essere annullato prima dell'esecuzione