Sobes.tech
Middle

İşlemlerde iptal mekanizmasından bahsedin.

sobes.tech yapay zeka

AI'dan gelen yanıt

iOS'taki işlemleri iptal etme mekanizması, Cancellable protokolü ve ilişkili türlerin kullanımına dayanır.

Ana bileşenler:

  1. Cancellable Protokolü: cancel() metodunun bulunmasını gerektirir ve iptal işlemini başlatır.

    // Protokol tanımı
    public protocol Cancellable {
        func cancel()
    }
    
  2. AnyCancellable: Cancellable ile uyumlu herhangi bir türü saklayan ve yok edilirken otomatik olarak cancel() çağıran sarmalayıcı türdür. Aboneliklerin/işlemlerin yaşam döngüsünü yönetmek için kullanışlıdır.

    // Kullanım örneği
    var cancellable = AnyCancellable {
        // İptal işlemi
        print("İşlem iptal edildi")
    }
    
    // `cancellable` tanımlandığı kapsamda, çıkışta `cancel()` çağrılır
    
  3. Combine'da İptal: Combine framework'ünde, çoğu Publisher, Cancellable'ı uygulayan Subscription sağlar. Subscription üzerindeki cancel() çağrısı, veri akışını durdurur. Genellikle, Subscription AnyCancellable içine alınır ve saklanır.

    // Combine örneği
    import Combine
    
    let publisher = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
    var cancellable: AnyCancellable? = publisher.sink { completion in
        print("Tamamlama: \(completion)")
    } receiveValue: { date in
        print("Değer: \(date)")
    }
    
    // Bir süre sonra iptal
    DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
        cancellable?.cancel() // `cancel()` çağrısı
        cancellable = nil // Referansı temizle
    }
    
  4. Operation ve OperationQueue: Eski API'lerde de iptal mekanizması vardır. Operation sınıfı cancel() metoduna ve isCancelled özelliğine sahiptir. OperationQueue, bu özelliği kontrol eder ve iptal edilen işlemleri planlamaz.

    import Foundation
    
    class MyOperation: Operation {
        override func main() {
            if isCancelled { // İptal durumu kontrolü
                print("İşlem başlamadan iptal edildi")
                return
            }
    
            // Görevi yerine getir
            for i in 0..<1000 {
                if isCancelled { // Görev sırasında iptal kontrolü
                    print("İşlem yürütme sırasında iptal edildi")
                    return
                }
                // Yoğun iş veya API çağrısı
                print("Adım \(i)")
            }
    
            print("İşlem tamamlandı")
        }
    }
    
    let queue = OperationQueue()
    let operation = MyOperation()
    
    queue.addOperation(operation)
    
    // Bir süre sonra iptal
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
       operation.cancel() // `cancel()` çağrısı
    }
    
    // Tamamlanmayı bekle (gerçek uygulamada ana thread'de yapılmamalı)
    // queue.waitUntilAllOperationsAreFinished()
    

iOS'taki iptal mekanizması asenkron ve işbirlikçidir. cancel() çağrısı, işlemi/veri akışını iptal etme niyetini sinyalize eder, ancak gerçek durdurma, işlemin bu sinyali nasıl işlediğine bağlıdır (örneğin, isCancelled kontrolü veya abonelik iptali tepkisiyle).

İptal edilebilir nesnelerin yönetimi (özellikle AnyCancellable) genellikle bunların koleksiyonlarda (Set<AnyCancellable>) veya nesne özelliklerinde saklanmasıyla yapılır, böylece konteynerin yok edilmesi veya koleksiyondan açıkça kaldırılması sırasında cancel() çağrılır.