Խոսեք ինձ գործողությունների չեղարկման մեխանիզմի մասին։
sobes.tech AI
Պատասխան AI-ից
Մեխանիզմը Cancellable պրոտոկոլի և կապված տիպերի օգտագործման վրա հիմնված է iOS-ում գործողությունների չեղարկման համար:
Հիմնական բաղադրիչներ՝
-
Cancellableպրոտոկոլ՝ սահմանում էcancel()մեթոդի պահանջը, որը սկսում է չեղարկումը:// Պրոտոկոլի սահմանման հատված public protocol Cancellable { func cancel() } -
AnyCancellable՝ տիպ-կափարիչ, որը պահում է ցանկացածCancellableհամապատասխան տիպ և ավտոմատ կերպով կանչում էcancel()՝ deinitialization ժամանակ:// Օգտագործման օրինակ var cancellable = AnyCancellable { // Չեղարկման գործողություն print("Օպերացիան չեղարկվեց") } // Scope-ի մեջ, որտեղ սահմանված է `cancellable`, դուրս գալուց հետո այն կանչում է `cancel()` -
Combine-ում՝ շատ publisher-ներ տրամադրում են
Subscription, որը իրականացնում էCancellableպրոտոկոլը։cancel()-ի կանչից հետո տվյալ հոսքը դադարում է։ ՀաճախSubscription-ը փաթեթավորվում էAnyCancellable-ի մեջ և պահվում:// Combine-ում օրինակ import Combine let publisher = Timer.publish(every: 1, on: .main, in: .common).autoconnect() var cancellable: AnyCancellable? = publisher.sink { completion in print("Ավարտ: \(completion)") } receiveValue: { date in print("Արժեք: \(date)") } // Չեղարկում որոշ ժամանակ անց DispatchQueue.main.asyncAfter(deadline: .now() + 3) { cancellable?.cancel() // `cancel()`-ի կանչ `AnyCancellable`-ի վրա cancellable = nil // Հղումից ազատում } -
OperationևOperationQueue՝ հին API-ում նույնպես կա չեղարկման մեխանիզմ։Operationդասը ունիcancel()մեթոդ ևisCancelledհատկություն։OperationQueue-ը ստուգում է այս հատկությունը և չի պլանավորում չեղարկված գործողությունների կատարմամբ:import Foundation class MyOperation: Operation { override func main() { if isCancelled { // Չեղարկման կարգավիճակի ստուգում print("Օպերացիան չեղարկվեց նախքան սկսելը") return } // Գործընթացի իրականացման հատված for i in 0..<1000 { if isCancelled { // Չեղարկման կարգավիճակի ստուգում ներսում print("Օպերացիան չեղարկվեց կատարման ժամանակ") return } // Կոշտ աշխատանք կամ API կանչ print("Քայլ \(i)") } print("Օպերացիան ավարտվեց") } } let queue = OperationQueue() let operation = MyOperation() queue.addOperation(operation) // Չեղարկում որոշ ժամանակ անց DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { operation.cancel() // `cancel()`-ի կանչ } // Սպասում ավարտին (օրինակ, գլխավոր հոսքում դա չպետք է անել) // queue.waitUntilAllOperationsAreFinished()
iOS-ում չեղարկման մեխանիզմը ասինխրոն է և համագործակցային։ cancel()-ի կանչը նշում է չեղարկման մտադրությունը, բայց իրական կանգնեցումը կախված է այն բանից, թե ինչպես է ինքնըստինքյան օպերացիան մշակել այդ նշանը (օրինակ, ստուգելով isCancelled կամ արձագանքելով չեղարկման գրանցմանը):
Չեղարկվող օբյեկտների կառավարումը (հատկապես AnyCancellable) հաճախ կատարվում է նրանց պահելով հավաքածուներում (Set<AnyCancellable>) կամ օբյեկտների հատկություններում՝ ապահովելու համար cancel()-ի կանչը կոնտեյների դեինիցյալիզացիայի կամ հանելու ժամանակ։