Sobes.tech
Middle

Kaip galima atšaukti sinchroninių užduočių vykdymą iOS?

sobes.tech AI

Atsakymas iš AI

Tiesioginio atšaukimo sinchroninėms užduotims (užblokavusioms dabartinį srautą) nėra.

Norint imituoti sinchroninės užduoties atšaukimą, galima naudoti šiuos metodus:

  1. Nuolatinė atšaukimo ženklo patikra: Sinchroninės užduoties logikoje pridėkite boolean žymeklį, kuris nustatomas iš išorės, jei reikia atšaukti. Jei žymeklis nustatytas, užduotis baigsis anksčiau.

    var isCancelled = false
    
    func performSynchronousTask() {
        // Užduoties pradžia
        for i in 0..<100000 {
            if isCancelled {
                print("Užduotis atšaukta")
                return // Anksčiau išėjimas
            }
            // Darbo dalies vykdymas
            // ... ilgas skaičiavimas ar operacija
        }
        print("Užduotis baigta")
    }
    
    func cancelTask() {
        isCancelled = true
    }
    
    // Pavyzdys naudojimo
    // performSynchronousTask() // Sinchroninis iškvietimas
    // cancelTask() // Iš kitos srovės atšaukti
    
  2. Naudojant try? Task.checkCancellation() asinchroniniame kontekste: Jei sinchroninė užduotis vyksta Task viduje Swift Concurrency, galima periodiškai iškviesti try? Task.checkCancellation(). Jei atšaukta, šis iškvietimas išmes CancellationError.

    func performCancellableSynchronousWork() throws {
        for i in 0..<100000 {
            try Task.checkCancellation() // Atšaukimo patikra
            // Darbo dalies vykdymas
            // ...
        }
    }
    
    // Pavyzdys naudojimo asinchroniniame kontekste
    /*
    let task = Task {
        do {
            try performCancellableSynchronousWork()
            print("Užduotis baigta")
        } catch is CancellationError {
            print("Užduotis atšaukta")
        } catch {
            print("Klaida: \(error)")
        }
    }
    
    // Atšaukti užduotį
    // task.cancel()
    */