Sobes.tech
Middle

Ako zrušiť vykonávanie synchronizovaných úloh v iOS?

sobes.tech AI

Odpoveď od AI

Priame zrušenie synchronných úloh (ktoré blokujú aktuálny vlákno) bez prerušenia vykonávania vlákna nie je možné.

Na simuláciu zrušenia synchronnej úlohy môžete použiť nasledujúce prístupy:

  1. Pravidelná kontrola vlajky zrušenia: Pridajte do logiky synchronnej úlohy kontrolu booleovskej vlajky, ktorá je nastavená zvonku, keď je potrebné zrušiť. Ak je vlajka nastavená, úloha sa predčasne ukončí.

    var isCancelled = false
    
    func performSynchronousTask() {
        // Začiatok úlohy
        for i in 0..<100000 {
            if isCancelled {
                print("Úloha zrušená")
                return // Predčasný odchod
            }
            // Vykonanie časti práce
            // ... dlhé výpočty alebo operácie
        }
        print("Úloha dokončená")
    }
    
    func cancelTask() {
        isCancelled = true
    }
    
    // Príklad použitia
    // performSynchronousTask() // Synchronná volanie
    // cancelTask() // Zavolať z iného vlákna na zrušenie
    
  2. Použitie try? Task.checkCancellation() v asynchrónnom kontexte: Ak sa synchronná úloha vykonáva v rámci Task v asynchrónnom kontexte Swift Concurrency, môžete ju periodicky volať. V prípade zrušenia tento volanie vyhodí CancellationError.

    func performCancellableSynchronousWork() throws {
        for i in 0..<100000 {
            try Task.checkCancellation() // Kontrola zrušenia
            // Vykonanie časti práce
            // ...
        }
    }
    
    // Príklad použitia v asynchrónnom kontexte
    /*
    let task = Task {
        do {
            try performCancellableSynchronousWork()
            print("Úloha dokončená")
        } catch is CancellationError {
            print("Úloha zrušená")
        } catch {
            print("Vyskytla sa chyba: \(error)")
        }
    }
    
    // Na zrušenie úlohy
    // task.cancel()
    */