Sobes.tech
Middle

Элдешүүлөрдө жокко чыгаруу механизми жөнүндө айтып бер.

sobes.tech AI

AIден жооп

iOSтогу операцияларды жокко чыгаруучу механизм Cancellable протоколу жана байланыштуу түрлөрдү колдонууга негизделген.

Негизги компоненттер:

  1. Cancellable протоколу: cancel() методу талап кылынганын аныктайт, ал жокко чыгарууну ишке ашырат.

    // Протоколдун аныктамасынан үзүндү
    public protocol Cancellable {
        func cancel()
    }
    
  2. AnyCancellable: Ар кандай Cancellable ылайыктуу түрүн сактай турган жана deinitialization учурунда автоматтык түрдө cancel() чакырган түр-оболтка. Ал жазылуулар/операциялардын өмүрүн башкарууда пайдалуу.

    // Колдонуу мисалы
    var cancellable = AnyCancellable {
        // Жокко чыгаруучу аракет
        print("Операция жокко чыгарылды")
    }
    
    // `cancellable` аныкталган scope ичинде, чыгуу менен `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() чакыруусун камсыз кылуу үчүн контейнердин деинициализациясы учурунда же коллекциядан түздөн-түз өчүрүлгөндө.