Pověz mi o mechanismu zrušení v operacích.
sobes.tech AI
Odpověď od AI
Mechanismus zrušení operací v iOS je založen na použití protokolu Cancellable a souvisejících typů.
Hlavní komponenty:
-
Cancellableprotokol: Určuje požadavek na metoducancel(), která spouští zrušení.// Fragment definice protokolu public protocol Cancellable { func cancel() } -
AnyCancellable: Typový obal, který uchovává jakýkoli typ odpovídajícíCancellablea automaticky volácancel()při deinitializaci. Je vhodný pro správu životního cyklu odběrů/operací.// Příklad použití var cancellable = AnyCancellable { // Akce zrušení print("Operace zrušena") } // V rámci scope, kde je definován cancellable, při opuštění volá `cancel()` -
V Combine: Většina publisherů poskytuje předplatné (
Subscription), které implementuje protokolCancellable. Při volánícancel()naSubscriptionse datový tok ukončí. Obvykle jeSubscriptionobalena doAnyCancellablea uchovávána.// Příklad v Combine import Combine let publisher = Timer.publish(every: 1, on: .main, in: .common).autoconnect() var cancellable: AnyCancellable? = publisher.sink { completion in print("Dokončení: \(completion)") } receiveValue: { date in print("Hodnota: \(date)") } // Zrušení po nějaké době DispatchQueue.main.asyncAfter(deadline: .now() + 3) { cancellable?.cancel() // Volání `cancel()` na `AnyCancellable` cancellable = nil // Uvolnění odkazu } -
OperationaOperationQueue: V starém API je také mechanismus zrušení. TřídaOperationmá metoducancel()a vlastnostisCancelled.OperationQueuekontroluje tuto vlastnost a nezahajuje provádění zrušených operací.import Foundation class MyOperation: Operation { override func main() { if isCancelled { // Kontrola stavu zrušení print("Operace byla zrušena před začátkem") return } // Provádění úkolu for i in 0..<1000 { if isCancelled { // Kontrola stavu zrušení uvnitř úkolu print("Operace byla zrušena během provádění") return } // Těžká práce nebo volání API print("Krok \(i)") } print("Operace dokončena") } } let queue = OperationQueue() let operation = MyOperation() queue.addOperation(operation) // Zrušení operace po nějaké době DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { operation.cancel() // Volání `cancel()` } // Čekání na dokončení (například, na hlavním vlákně to nedělat) // queue.waitUntilAllOperationsAreFinished()
Mechanismus zrušení v iOS je asynchronní a kooperativní. Volání cancel() signalizuje záměr zrušit operaci/datový tok, ale skutečné zastavení závisí na tom, jak sama operace tento signál zpracovává (například kontrolou isCancelled nebo reakcí na zrušení předplatného).
Správa zrušitelných objektů (zejména AnyCancellable) se často provádí jejich uložením do kolekcí (Set<AnyCancellable>) nebo vlastností objektů, aby bylo zajištěno volání cancel() při deinitializaci kontejneru nebo při přímém odstranění z kolekce.