Sobes.tech
Middle

Əməliyyatlarda ləğv mexanizmi haqqında danış.

sobes.tech Süni İntellekt

AI-dan cavab

iOS-də əməliyyatların ləğvi mexanizmi Cancellable protokolu və əlaqəli tiplərdən istifadə etməklə əsaslanır.

Əsas komponentlər:

  1. Cancellable Protokolu: cancel() metodunun mövcudluğunu tələb edir, bu da ləğvi təşviq edir.

    // Protokolun tərifi
    public protocol Cancellable {
        func cancel()
    }
    
  2. AnyCancellable: Hər hansı Cancellable uyğun tipini saxlayan və deinitialization zamanı avtomatik olaraq cancel() çağıran tiplə örtükdür. Abunəliklərin/əməliyyatların həyat dövrünü idarə etmək üçün əlverişlidir.

    // İstifadə nümunəsi
    var cancellable = AnyCancellable {
        // Ləğv etmə fəaliyyəti
        print("Əməliyyat ləğv edildi")
    }
    
    // `cancellable` müəyyən scope daxilində, çıxış zamanı `cancel()` çağırılacaq
    
  3. Combine-də ləğv: Combine çərçivəsində əksər Publisher'lar Subscription təqdim edir, bu da Cancellable protokolunu həyata keçirir. cancel() çağırıldıqda, məlumat axını dayanır. Adətən Subscription AnyCancellable-ə çevrilir və saxlanılır.

    // Combine nümunəsi
    import Combine
    
    let publisher = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
    var cancellable: AnyCancellable? = publisher.sink { completion in
        print("Tamamlanma: \(completion)")
    } receiveValue: { date in
        print("Dəyər: \(date)")
    }
    
    // Bir müddət sonra ləğv
    DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
        cancellable?.cancel() // `cancel()` çağırılır
        cancellable = nil // Referans silinir
    }
    
  4. OperationOperationQueue: Köhnə API-də də ləğv mexanizmi mövcuddur. Operation sinfi cancel() metoduna və isCancelled xüsusiyyətinə malikdir. OperationQueue bu xüsusiyyəti yoxlayır və ləğv edilmiş əməliyyatların icrasını planlaşdırmır.

    import Foundation
    
    class MyOperation: Operation {
        override func main() {
            if isCancelled { // Ləğv statusunun yoxlanması
                print("Əməliyyat başlamadan ləğv edildi")
                return
            }
    
            // Tapşırığın yerinə yetirilməsi
            for i in 0..<1000 {
                if isCancelled { // Tapşırıq daxilində ləğv statusunun yoxlanması
                    print("Əməliyyat yerinə yetirilərkən ləğv edildi")
                    return
                }
                // Çətin iş və ya API çağırışı
                print("Addım \(i)")
            }
    
            print("Əməliyyat tamamlandı")
        }
    }
    
    let queue = OperationQueue()
    let operation = MyOperation()
    
    queue.addOperation(operation)
    
    // Bir müddət sonra əməliyyatı ləğv et
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
       operation.cancel() // `cancel()` çağırılır
    }
    
    // Tamamlanmasını gözləyir (nümunə üçün, real tətbiqdə bu düzgün deyil main thread-də)
    // queue.waitUntilAllOperationsAreFinished()
    

iOS-də ləğv mexanizmi asinxron və kooperativdir. cancel() çağırışı əməliyyat/məlumat axını ləğv etmək niyyətini bildirir, lakin faktiki dayandırma əməliyyatın özünün isCancelled yoxlaması və ya abunəliyin ləğvi kimi reaksiya verməsindən asılıdır.

Ləğv edilə bilən obyektlərin idarə olunması (xüsusən AnyCancellable) tez-tez onların kolleksiyalarda (Set<AnyCancellable>) və ya obyektlərin xüsusiyyətlərində saxlanması ilə həyata keçirilir ki, bu da cancel() çağırışını təmin edir, obyektin deinitialization zamanı və ya kolleksiyadan əl ilə silinməsi zamanı.