Sobes.tech
Middle

iOS'da sinxron vazifalarni bajarilishini qanday bekor qilish mumkin?

sobes.tech AI

AIdan javob

Senkron vazifalarni (hozirgi oqimni bloklaydigan) toʻgʻridan-toʻgʻri bekor qilish va oqimni bajarilishini toʻxtatmasdan amalga oshirish mumkin emas.

Senkron vazifani bekor qilishni simulyatsiya qilish uchun quyidagi yondashuvlardan foydalanish mumkin:

  1. Bekor qilish bayrogʻini muntazam tekshirish: Senkron vazifa mantiqiga tashqaridan belgilangan boolean bayroqni tekshirishni qoʻshing. Agar bayroq oʻrnatilgan boʻlsa, vazifa oldindan tugatiladi.

    var isCancelled = false
    
    func performSynchronousTask() {
        // Vazifaning boshlanishi
        for i in 0..<100000 {
            if isCancelled {
                print("Vazifa bekor qilindi")
                return // Oldindan chiqish
            }
            // Ishning bir qismini bajarish
            // ... uzoq hisoblashlar yoki operatsiyalar
        }
        print("Vazifa yakunlandi")
    }
    
    func cancelTask() {
        isCancelled = true
    }
    
    // Foydalanish misoli
    // performSynchronousTask() // Sinxron chaqiriq
    // cancelTask() // Boshqa oqimdan chaqirish uchun
    
  2. try? Task.checkCancellation() dan foydalanish (asynchronous kontekstda): Agar sinxron vazifa Swift Concurrency ning Task ichida bajarilayotgan bo‘lsa, uni muntazam ravishda chaqirish mumkin. Bekor qilish holatida, bu chaqiriq CancellationErrorni tashlaydi.

    func performCancellableSynchronousWork() throws {
        for i in 0..<100000 {
            try Task.checkCancellation() // Bekor qilishni tekshirish
            // Ishning bir qismini bajarish
            // ...
        }
    }
    
    // Asynchronous kontekstda foydalanish misoli
    /*
    let task = Task {
        do {
            try performCancellableSynchronousWork()
            print("Vazifa yakunlandi")
        } catch is CancellationError {
            print("Vazifa bekor qilindi")
        } catch {
            print("Xato yuz berdi: \(error)")
        }
    }
    
    // Vazifani bekor qilish uchun
    // task.cancel()
    */