Sobes.tech
Junior — Middle

Czy możliwe jest anulowanie wykonania zadania przy użyciu GCD w iOS?

sobes.tech AI

Odpowiedź od AI

W GCD (Grand Central Dispatch) na iOS bezpośrednie anulowanie zadania jest niemożliwe, jeśli zadanie już zostało uruchomione. GCD nie zapewnia wbudowanego mechanizmu do przerwania działającego bloku.

Jednak można zaimplementować pośrednie anulowanie:

  • Używać flag lub zmiennych stanu, które są sprawdzane wewnątrz bloku zadania i w razie potrzeby kończyć wykonywanie wcześniej.
  • Dla operacji asynchronicznych używać DispatchWorkItem, który obsługuje metodę cancel(). Anulowanie przez DispatchWorkItem zapobiega uruchomieniu zadania, jeśli jeszcze się nie rozpoczęło.

Przykład z DispatchWorkItem:

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

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

// Anuluj zadanie
workItem.cancel()

W ten sposób anulowanie jest możliwe przed rozpoczęciem lub wewnątrz zadania, sprawdzając flagę, ale nie można przerwać już działającego bloku w GCD.