Sobes.tech
Middle

Amaliyotlarda bekor qilish mexanizmi haqida gapiring.

sobes.tech AI

AIdan javob

iOS'da operatsiyalarni bekor qilish mexanizmi Cancellable protokoli va bog'liq turlarni ishlatishga asoslangan.

Asosiy komponentlar:

  1. Cancellable protokoli: cancel() metodiga ega bo‘lish shartini belgilaydi, bu bekor qilishni boshlaydi.

    // Protokol ta'rifi qisqacha
    public protocol Cancellable {
        func cancel()
    }
    
  2. AnyCancellable: Cancellable ga mos keladigan har qanday turni saqlovchi va deinitializatsiya paytida avtomatik ravishda cancel() chaqiradigan qobiq turi. Bu obuna/operatsiya tsiklini boshqarishda qulay.

    // Misol
    var cancellable = AnyCancellable {
        // Bekor qilish harakati
        print("Operatsiya bekor qilindi")
    }
    
    // `cancellable` ni belgilangan scope ichida, chiqishda `cancel()` chaqiriladi
    
  3. Combine'da bekor qilish: Combine frameworkida, ko‘pchilik Publisherlar Subscription taqdim etadi, u Cancellable ni amalga oshiradi. cancel() chaqirilganda, ma'lumot oqimi to‘xtaydi. Odatda, Subscription AnyCancellable ga o‘raladi va saqlanadi.

    // Combine'da misol
    import Combine
    
    let publisher = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
    var cancellable: AnyCancellable? = publisher.sink { completion in
        print("Yakun: \(completion)")
    } receiveValue: { date in
        print("Qiymat: \(date)")
    }
    
    // Bir muddatdan so‘ng bekor qilish
    DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
        cancellable?.cancel() // `cancel()` chaqirish
        cancellable = nil // Referensiyani tozalash
    }
    
  4. Operation va OperationQueue: Eski API'larda ham bekor qilish mexanizmi mavjud. Operation sinfida cancel() metodi va isCancelled xususiyati bor. OperationQueue bu xususiyatni tekshiradi va bekor qilingan operatsiyalarni rejalashtirmaydi.

    import Foundation
    
    class MyOperation: Operation {
        override func main() {
            if isCancelled { // Bekor qilish holatini tekshirish
                print("Operatsiya bekor qilindi")
                return
            }
    
            // Vazifani bajarish
            for i in 0..<1000 {
                if isCancelled { // Vazifa davomida tekshirish
                    print("Operatsiya davomida bekor qilindi")
                    return
                }
                // Og‘ir ish yoki API chaqiruvi
                print("Qadam \(i)")
            }
    
            print("Operatsiya tugadi")
        }
    }
    
    let queue = OperationQueue()
    let operation = MyOperation()
    
    queue.addOperation(operation)
    
    // Bir muddatdan so‘ng bekor qilish
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
       operation.cancel() // `cancel()` chaqirish
    }
    
    // Yakunlanishni kutish (asosiy oqimda qilish tavsiya etilmaydi)
    // queue.waitUntilAllOperationsAreFinished()
    

iOS'da bekor qilish mexanizmi asinxron va hamkorlikda bo‘ladi. cancel() chaqirilganda, bu operatsiya/ma'lumot oqimini bekor qilish niyatini bildiradi, ammo haqiqiy to‘xtash, operatsiya qanday bu signalni ishlov berishiga bog‘liq (masalan, isCancelled tekshirish yoki obuna bekor qilishga javob berish).

Bekor qilinadigan ob'ektlarni boshqarish (xususan, AnyCancellable) ko‘pincha ularni kolleksiyalarda (Set<AnyCancellable>) yoki ob'ektlarning xususiyatlarida saqlash orqali amalga oshiriladi, shunda konteyner deinitializatsiya qilinayotganda yoki kolleksiyadan ochiq-oydin olib tashlanganda cancel() chaqiriladi.