Sobes.tech
Middle

როგორ შეიძლება გაუქმდეს iOS-ში სინქრონული დავალებების შესრულება?

sobes.tech AI

პასუხი AI-სგან

მხოლოდ პირდაპირი გაუქმება სინქრონული დავალებების (რომლებმა ბლოკავდნენ მიმდინარე ნაკადს) გარეშე შეწყვეტა შეუძლებელია.

სინქრონული დავალების გაუქმების იმიტაციისთვის შეიძლება გამოიყენოთ შემდეგი მიდგომები:

  1. გაგრძელებული შემოწმება გაუქმების ნიშნის: სინქრონული დავალების ლოგიკაში დაამატეთ ბულიანი ნიშანი, რომელიც გარედან არის დაყენებული საჭიროების შემთხვევაში. თუ ნიშანი დაყენებულია, დავალება ადრე დასრულდება.

    var isCancelled = false
    
    func performSynchronousTask() {
        // დავალების დაწყება
        for i in 0..<100000 {
            if isCancelled {
                print("დავალება გაუქმდა")
                return // ადრე გასვლა
            }
            // სამუშაო ნაწილის შესრულება
            // ... გრძელი გამოთვლა ან ოპერაცია
        }
        print("დავალება დასრულდა")
    }
    
    func cancelTask() {
        isCancelled = true
    }
    
    // გამოყენების მაგალითი
    // performSynchronousTask() // სინქრონული გამოძახება
    // cancelTask() // სხვა ნაკადიდან გაუქმებისთვის
    
  2. try? Task.checkCancellation() გამოყენება ასინქრონულ კონტექსტში: თუ სინქრონული დავალება შესრულდება Task შიგნით Swift Concurrency-ში, შეგიძლიათ პერიოდულად გამოიძახოთ try? Task.checkCancellation(). გაუქმების შემთხვევაში, ეს გამოძახება გამოიწვევს CancellationError-ს.

    func performCancellableSynchronousWork() throws {
        for i in 0..<100000 {
            try Task.checkCancellation() // გაუქმების შემოწმება
            // სამუშაო ნაწილის შესრულება
            // ...
        }
    }
    
    // გამოყენება ასინქრონულ კონტექსტში
    /*
    let task = Task {
        do {
            try performCancellableSynchronousWork()
            print("დავალება დასრულდა")
        } catch is CancellationError {
            print("დავალება გაუქმდა")
        } catch {
            print("შეცდომა: \(error)")
        }
    }
    
    // დავალების გაუქმება
    // task.cancel()
    */