Papaskink man apie operacijų atšaukimo mechanizmą.
sobes.tech AI
Atsakymas iš AI
iOS operacijų atšaukimo mechanizmas grindžiamas Cancellable protokolu ir susijusiais tipais.
Pagrindiniai komponentai:
-
Cancellableprotokolas: Nustato reikalavimą turėti metodącancel(), kuris inicijuoja atšaukimą.// Protokolo apibrėžimo fragmentas public protocol Cancellable { func cancel() } -
AnyCancellable: Tipas-apvalkalas, kuris saugo bet kurįCancellableatitinkantį tipą ir automatiškai iškviečiacancel()deiniatizacijos metu. Naudinga valdyti prenumeratų/operacijų gyvavimo ciklą.// Pavyzdys naudojimo var cancellable = AnyCancellable { // Atšaukimo veiksmas print("Operacija atšaukta") } // Scope viduje, kur yra apibrėžtas cancellable, išėjus jis iškvies `cancel()` -
Atšaukimas Combine framework'e: Dauguma
Publisherteikia prenumeratą (Subscription), kuri įgyvendinaCancellable. Iškvietuscancel()Subscription, duomenų srautas sustoja. PaprastaiSubscriptionįpakuojama įAnyCancellableir saugoma.// Pavyzdys Combine'e import Combine let publisher = Timer.publish(every: 1, on: .main, in: .common).autoconnect() var cancellable: AnyCancellable? = publisher.sink { completion in print("Užbaigimas: \(completion)") } receiveValue: { date in print("Reikšmė: \(date)") } // Atšaukimas po tam tikro laiko DispatchQueue.main.asyncAfter(deadline: .now() + 3) { cancellable?.cancel() // `cancel()` iš `AnyCancellable` cancellable = nil // nuorodos ištrynimas } -
OperationirOperationQueue: Senesniuose API taip pat yra atšaukimo mechanizmas.Operationklasė turi metodącancel()ir savybęisCancelled.OperationQueuetikrina šią savybę ir neplanuoja vykdyti atšauktų operacijų.import Foundation class MyOperation: Operation { override func main() { if isCancelled { // atšaukimo būsenos patikrinimas print("Operacija atšaukta prieš pradžią") return } // Darbo vykdymas for i in 0..<1000 { if isCancelled { // atšaukimo būsenos patikrinimas viduje print("Operacija atšaukta vykdymo metu") return } // Sudėtingas darbas arba API iškvietimas print("Žingsnis \(i)") } print("Operacija baigta") } } let queue = OperationQueue() let operation = MyOperation() queue.addOperation(operation) // Atšaukimas po tam tikro laiko DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { operation.cancel() // `cancel()` iškvietimas } // Laukti pabaigos (pavyzdžiui, realioje programoje nereikėtų taip daryti pagrindiniame sraute) // queue.waitUntilAllOperationsAreFinished()
iOS atšaukimo mechanizmas yra asinchroninis ir kooperatyvus. cancel() iškvietimas signalizuoja apie ketinimą atšaukti operaciją/srautą, tačiau faktinis sustojimas priklauso nuo to, kaip pati operacija apdoroja šį signalą (pvz., tikrindama isCancelled arba reaguodama į atšaukimo prenumeratą).
Gali būti valdomi atšaukiami objektai (ypač AnyCancellable) dažnai saugomi kolekcijose (Set<AnyCancellable>) arba objektų savybėse, kad būtų garantuotas cancel() iškvietimas deiniatizacijos metu arba ištraukimo iš kolekcijos metu.