Sobes.tech
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