Sobes.tech
Middle

Kuidas saab iOS-is sünkrooniliste ülesannete täitmist tühistada?

sobes.tech AI

Vastus AI-lt

Pärisots sinhronsete ülesannete (mis blokeerisid praeguse voolu) tühistamine ei ole võimalik.

Sinhronse ülesande tühistamise imiteerimiseks saab kasutada järgmisi lähenemisviise:

  1. Püsiv tühistamise lipu kontroll: Lisage sinhronilise ülesande loogikale booleantipp, mis määratakse väljastpoolt vajadusel tühistamiseks. Kui lipp on seatud, lõpeb ülesanne varem.

    var isCancelled = false
    
    func performSynchronousTask() {
        // Ülesande algus
        for i in 0..<100000 {
            if isCancelled {
                print("Ülesanne tühistati")
                return // Varasem väljumine
            }
            // Töö osa täitmine
            // ... pikk arvutus või operatsioon
        }
        print("Ülesanne lõpetatud")
    }
    
    func cancelTask() {
        isCancelled = true
    }
    
    // Näide kasutamisest
    // performSynchronousTask() // Sünkroonne väljakutse
    // cancelTask() // Teisest voost tühistamiseks
    
  2. try? Task.checkCancellation() kasutamine asünkroonses kontekstis: Kui sinhronine ülesanne täidetakse Task sees Swift Concurrency-s, saab perioodiliselt kutsuda try? Task.checkCancellation(). Kui tühistamine on toimunud, viskab see CancellationError.

    func performCancellableSynchronousWork() throws {
        for i in 0..<100000 {
            try Task.checkCancellation() // Tühistamise kontroll
            // Töö osa täitmine
            // ...
        }
    }
    
    // Näide kasutamisest asünkroonses kontekstis
    /*
    let task = Task {
        do {
            try performCancellableSynchronousWork()
            print("Ülesanne lõpetatud")
        } catch is CancellationError {
            print("Ülesanne tühistati")
        } catch {
            print("Viga: \(error)")
        }
    }
    
    // Tühista ülesanne
    // task.cancel()
    */