Sobes.tech
Middle

Խոսեք ինձ գործողությունների չեղարկման մեխանիզմի մասին։

sobes.tech AI

Պատասխան AI-ից

Մեխանիզմը Cancellable պրոտոկոլի և կապված տիպերի օգտագործման վրա հիմնված է iOS-ում գործողությունների չեղարկման համար:

Հիմնական բաղադրիչներ՝

  1. Cancellable պրոտոկոլ՝ սահմանում է cancel() մեթոդի պահանջը, որը սկսում է չեղարկումը:

    // Պրոտոկոլի սահմանման հատված
    public protocol Cancellable {
        func cancel()
    }
    
  2. AnyCancellable՝ տիպ-կափարիչ, որը պահում է ցանկացած Cancellable համապատասխան տիպ և ավտոմատ կերպով կանչում է cancel()՝ deinitialization ժամանակ:

    // Օգտագործման օրինակ
    var cancellable = AnyCancellable {
        // Չեղարկման գործողություն
        print("Օպերացիան չեղարկվեց")
    }
    
    // Scope-ի մեջ, որտեղ սահմանված է `cancellable`, դուրս գալուց հետո այն կանչում է `cancel()`
    
  3. 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 // Հղումից ազատում
    }
    
  4. 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()-ի կանչը կոնտեյների դեինիցյալիզացիայի կամ հանելու ժամանակ։