Ə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:
-
CancellableProtokolu:cancel()metodunun mövcudluğunu tələb edir, bu da ləğvi təşviq edir.// Protokolun tərifi public protocol Cancellable { func cancel() } -
AnyCancellable: Hər hansıCancellableuyğun tipini saxlayan və deinitialization zamanı avtomatik olaraqcancel()ç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 -
Combine-də ləğv: Combine çərçivəsində əksər Publisher'lar
Subscriptiontəqdim edir, bu daCancellableprotokolunu həyata keçirir.cancel()çağırıldıqda, məlumat axını dayanır. AdətənSubscriptionAnyCancellable-ə ç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 } -
OperationvəOperationQueue: Köhnə API-də də ləğv mexanizmi mövcuddur.Operationsinficancel()metoduna vəisCancelledxüsusiyyətinə malikdir.OperationQueuebu 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ı.