Sobes.tech
Middle

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:

  1. 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
    }
    
  2. 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à
    }
    
  3. 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
    }
    
  4. 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
    }
    
  5. Esecuzione di iterazioni (concurrentPerform): Permette di eseguire un blocco di codice iterations volte in parallelo su una coda concorrente.

    DispatchQueue.concurrentPerform(iterations: 100) { index in
        // Codice eseguito per ogni indice in parallelo
    }
    
  6. 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()