Sobes.tech
Junior — Middle

Czy można przerwać wykonanie zadania w GCD przed jego zakończeniem?

sobes.tech AI

Odpowiedź od AI

W GCD (Grand Central Dispatch) nie można bezpośrednio przerwać wykonywania zadania, które już zostało uruchomione. Zadania wysłane do kolejki są wykonywane do momentu zakończenia.

Jednak można zaimplementować anulowanie zadania pośrednio:

  • Dla zadań asynchronicznych użyj DispatchWorkItem, który obsługuje metodę cancel(). Zadanie samo musi okresowo sprawdzać właściwość isCancelled i poprawnie kończyć się, jeśli zostanie żądane anulowanie.

Przykład:

let workItem = DispatchWorkItem {
    for i in 0..<1000 {
        if workItem.isCancelled {
            print("Zadanie anulowane")
            return
        }
        // Wykonanie pracy
    }
}

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

// Później
workItem.cancel()

W związku z tym, anulowanie jest możliwe tylko wtedy, gdy zadanie obsługuje sprawdzanie anulowania, w przeciwnym razie nie można go wymusić na przerwanie.