Sobes.tech
Junior — Middle

È possibile interrompere l'esecuzione di un compito in GCD prima del suo completamento?

sobes.tech AI

Risposta dell'AI

In GCD (Grand Central Dispatch), non è possibile interrompere direttamente l'esecuzione di un task già avviato. I task inviati in coda vengono eseguiti fino al completamento.

Tuttavia, è possibile implementare l'annullamento di un task in modo indiretto:

  • Per i task asincroni, utilizzare DispatchWorkItem, che supporta il metodo cancel(). Il task stesso deve verificare periodicamente la proprietà isCancelled e terminare correttamente se viene richiesta l'annullamento.

Esempio:

let workItem = DispatchWorkItem {
    for i in 0..<1000 {
        if workItem.isCancelled {
            print("Task annullato")
            return
        }
        // Eseguire il lavoro
    }
}

DispatchQueue.global().async(execute: workItem)

// Più tardi
workItem.cancel()

Pertanto, l'annullamento è possibile solo se il task supporta il controllo di cancellazione, altrimenti non può essere interrotto forzatamente.