Sobes.tech
Middle

Pastāsti man par operāciju atcelšanas mehānismu.

sobes.tech AI

Atbilde no AI

iOS operāciju atcelšanas mehānisms balstās uz Cancellable protokolu un ar to saistītajiem tipiem.

Galvenās sastāvdaļas:

  1. Cancellable protokols: Nosaka prasību pēc cancel() metodes, kas iniciē atcelšanu.

    // Protokola definīcijas fragments
    public protocol Cancellable {
        func cancel()
    }
    
  2. AnyCancellable: Tipa apvalks, kas glabā jebkuru Cancellable atbilstīgu tipu un automātiski izsauc cancel() dezinicializācijas laikā. Noderīgs abonementu/operāciju dzīves cikla pārvaldībā.

    // Piemērs lietošanai
    var cancellable = AnyCancellable {
        // Atcelšanas darbība
        print("Operācija atcelta")
    }
    
    // Scope iekšpusē, kur ir definēts cancellable, iziešanas brīdī tas izsauks `cancel()`
    
  3. Atcelšana Combine ietvarā: Lielākā daļa Publisher nodrošina abonementu (Subscription), kas realizē Cancellable. Izsaucot cancel() uz Subscription, datu plūsma apstājas. Parasti Subscription ir ietverts AnyCancellable un tiek glabāts.

    // Piemērs Combine
    import Combine
    
    let publisher = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
    var cancellable: AnyCancellable? = publisher.sink { completion in
        print("Pabeigšana: \(completion)")
    } receiveValue: { date in
        print("Vērtība: \(date)")
    }
    
    // Atcelšana pēc noteikta laika
    DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
        cancellable?.cancel() // `cancel()` no `AnyCancellable`
        cancellable = nil // atsauces dzēšana
    }
    
  4. Operation un OperationQueue: Vecākajos API arī ir atcelšanas mehānisms. Operation klasei ir metode cancel() un īpašība isCancelled. OperationQueue pārbauda šo īpašību un neplāno izpildīt atcelto operāciju.

    import Foundation
    
    class MyOperation: Operation {
        override func main() {
            if isCancelled { // atcelšanas statuss
                print("Operācija atcelta pirms sākuma")
                return
            }
    
            // Darbības izpilde
            for i in 0..<1000 {
                if isCancelled { // atcelšanas statuss iekšā
                    print("Operācija atcelta izpildes laikā")
                    return
                }
                // Smags darbs vai API izsaukums
                print("Solis \(i)")
            }
    
            print("Operācija pabeigta")
        }
    }
    
    let queue = OperationQueue()
    let operation = MyOperation()
    
    queue.addOperation(operation)
    
    // Atcelšana pēc noteikta laika
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
       operation.cancel() // `cancel()` izsaukšana
    }
    
    // Gaidīt pabeigšanu (piemēram, reālajā lietojumā tā nedarītu galvenajā pavedienā)
    // queue.waitUntilAllOperationsAreFinished()
    

iOS atcelšanas mehānisms ir asinhrons un kooperatīvs. cancel() izsaukums signalizē par nodomu atcelt operāciju/plūsmu, bet faktiskais apturēšanas process ir atkarīgs no tā, kā pati operācija apstrādā šo signālu (piem., pārbaudot isCancelled vai reaģējot uz atcelšanas abonementu).

Gadījumā, ja ir atcelšanas objekti (īpaši AnyCancellable), tie bieži tiek glabāti kolekcijās (Set<AnyCancellable>) vai īpašībās, lai nodrošinātu cancel() izsaukšanu dezinicializācijas laikā vai izņemot no kolekcijas.