Sobes.tech
Junior — Middle

Da li je moguće prekinuti izvršenje zadatka u GCD pre njegovog završetka?

sobes.tech АИ

Одговор од АИ

У GCD (Grand Central Dispatch) није могуће директно прекинути већ покренуту задаћу. Задаци послати у ред се извршавају до завршетка.

Међутим, могуће је реализовати отказ задатка индиректно:

  • За асинхроне задатке користите DispatchWorkItem, који подржава метод cancel(). Сам задатак треба периодично да проверава својство isCancelled и правилно да се завршава ако је захтеван отказ.

Пример:

let workItem = DispatchWorkItem {
    for i in 0..<1000 {
        if workItem.isCancelled {
            print("Задача отказана")
            return
        }
        // Извршавање посла
    }
}

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

// Касније
workItem.cancel()

Дакле, отказ је могућ само ако задатак подржава проверу отказа, у супротном га не може принудно прекинути.