Sobes.tech
Middle

Räägi mulle operatsioonide tühistamise mehhanismist.

sobes.tech AI

Vastus AI-lt

iOS-i operatsioonide tühistamise mehhanism põhineb Cancellable protokollil ja sellega seotud tüüpidel.

Peamised komponendid:

  1. Cancellable protokoll: Määrab nõude olemasolevale meetodile cancel(), mis algatab tühistamise.

    // Protokolli määratluse fragment
    public protocol Cancellable {
        func cancel()
    }
    
  2. AnyCancellable: Tüüp-kest, mis hoiab mis tahes Cancellable-le vastavat tüüpi ja kutsub automaatselt cancel() välja de-initsialiseerimisel. Kasulik tellimuste/operatsioonide elutsükli haldamiseks.

    // Kasutamise näide
    var cancellable = AnyCancellable {
        // Tühistamise tegevus
        print("Operatsioon tühistatud")
    }
    
    // Scope sees, kus on määratletud cancellable, väljudes kutsutakse välja `cancel()`
    
  3. Tühistamine Combine raamistikus: Enamik Publisher-eid pakub tellimust (Subscription), mis realiseerib Cancellable. Kui kutsute cancel() Subscription-il, lõpetatakse andmevoog. Tavaliselt pakitakse Subscription AnyCancellable-i ja hoitakse.

    // Näide Combine'is
    import Combine
    
    let publisher = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
    var cancellable: AnyCancellable? = publisher.sink { completion in
        print("Lõpetamine: \(completion)")
    } receiveValue: { date in
        print("Väärtus: \(date)")
    }
    
    // Tühistamine teatud aja pärast
    DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
        cancellable?.cancel() // `cancel()` `AnyCancellable`-ilt
        cancellable = nil // viite eemaldamine
    }
    
  4. Operation ja OperationQueue: Vanemates API-ides on samuti tühistamise mehhanism. Operation klassil on meetod cancel() ja omadus isCancelled. OperationQueue kontrollib seda omadust ja ei planeeri tühistatud operatsioone.

    import Foundation
    
    class MyOperation: Operation {
        override func main() {
            if isCancelled { // tühistamise oleku kontroll
                print("Operatsioon tühistatud enne alustamist")
                return
            }
    
            // Töö teostamine
            for i in 0..<1000 {
                if isCancelled { // tühistamise oleku kontroll sees
                    print("Operatsioon tühistatud täitmise ajal")
                    return
                }
                // Raske töö või API kutsumine
                print("Samm \(i)")
            }
    
            print("Operatsioon lõpetatud")
        }
    }
    
    let queue = OperationQueue()
    let operation = MyOperation()
    
    queue.addOperation(operation)
    
    // Tühistamine teatud aja pärast
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
       operation.cancel() // `cancel()`-i väljakutse
    }
    
    // Oodata lõpetamist (näiteks, reaalses rakenduses seda ei teeks peamisel lõngal)
    // queue.waitUntilAllOperationsAreFinished()
    

iOS-i tühistamise mehhanism on asünkroonne ja koostööaldis. cancel()-i väljakutse teavitab tühistamise kavatsusest, kuid tegelik peatamine sõltub sellest, kuidas operatsioon seda signaali töötleb (näiteks kontrollides isCancelled või reageerides tellimuse tühistamisele).

Tühistatavate objektide (eriti AnyCancellable) haldamine toimub sageli nende hoidmisega kogumites (Set<AnyCancellable>) või omadustena, et tagada cancel()-i väljakutse de-initsialiseerimisel või eemaldamisel kogumistest.