Sobes.tech
Middle

Cos'è Grand Central Dispatch e come viene utilizzato nello sviluppo iOS?

sobes.tech AI

Risposta dell'AI

Grand Central Dispatch (GCD) — un'API di basso livello per la gestione del multitasking, che fornisce un pool di thread di sistema e pianifica l'esecuzione di compiti su di essi.

Concetti principali di GCD:

  • Code di dispatch: Code in cui vengono inseriti blocchi di codice (compiti) per l'esecuzione.
    • Code seriali: Eseguono i blocchi in ordine di inserimento, uno alla volta.
    • Code concorrenti: Eseguono i blocchi in parallelo, ma in ordine di inserimento.
  • Compiti (Blocchi): Unità di lavoro inviate alle code di dispatch.
  • Sorgenti di dispatch: Monitoraggio di eventi di sistema (file, socket, segnali), che invocano l'esecuzione di blocchi quando si verificano.

Utilizzato per:

  1. Eseguire operazioni in background: Caricamento dati da rete, elaborazione di immagini, calcoli complessi, per non bloccare il thread principale (UI).

    DispatchQueue.global(qos: .userInitiated).async {
        // Esecuzione di un'operazione intensiva
        let processedData = performHeavyProcessing()
    
        DispatchQueue.main.async {
            // Aggiornamento UI sul thread principale
            updateUI(with: processedData)
        }
    }
    
  2. Pianificazione di compiti: Esecuzione differita o periodica.

    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        // Questo codice verrà eseguito tra 2 secondi
        print("Esecuzione differita")
    }
    
  3. Sincronizzazione dell'accesso ai dati: Uso di code seriali o DispatchQueue.concurrentPerform per controllare l'accesso parallelo.

    let syncQueue = DispatchQueue(label: "com.myapp.syncdatasource", attributes: .concurrent)
    var sharedArray = [Int]()
    
    func addItem(_ item: Int) {
        syncQueue.async(flags: .barrier) { // Uso di .barrier per accesso esclusivo in scrittura
            sharedArray.append(item)
        }
    }
    
    func processItems() {
        syncQueue.sync { // Lettura sincrona
            for item in sharedArray {
                print(item)
            }
        }
    }
    

Vantaggi rispetto alla gestione manuale dei thread (POSIX threads):

  • Facilità d'uso: Livello di astrazione superiore.
  • Efficienza: GCD gestisce in modo più efficiente il pool di thread di sistema, riducendo i costi.
  • Scalabilità: Si adatta automaticamente al numero di core del processore.

Tipi di QoS (Qualità del servizio): Determina la priorità del compito per il pianificatore GCD.

QoS Applicazione
userInteractive Aggiornamenti UI, animazioni, risposta rapida
userInitiated Compiti avviati dall'utente, che richiedono completamento rapido (caricamento, elaborazione foto)
default Priorità di default, tra userInitiated e utility
utility Compiti di lunga durata senza urgenza (caricamento, indicizzazione)
background Compiti invisibili all'utente (backup, sincronizzazione in background)
unspecified Priorità non specificata, determinata dal sistema