Как отменить указанную c операцию из OperationQueue в swift - PullRequest
3 голосов
/ 27 января 2020

В моем OperationQueue есть 3 операции, и я не могу отменить указанную c операцию из них.

Я ссылался на этот пример, но не могу понять его NSOperationQueue отменить спецификацию c операции

Это мой код

class myOperation1 : Operation {

    override func main() {

        print("op1 (?) working....")

        for i in 1...10 {
            print("?")
        }
    }
}

class myOperation2 : Operation {

    override func main() {

        print("op2 (?) working....")

        for i in 1...10 {
            print("?")
        }
    }
}

class myOperation3 : Operation {

    override func main() {

        print("op3 (?) working....")
        for i in 1...10 {
            print("?")
        }
    }
}

let op1 = myOperation1()
let op2 = myOperation2()
let op3 = myOperation3()

op1.completionBlock = {
    print("op1 (?) completed")
}

op2.completionBlock = {
    print("op2 (?) completed")
}

op3.completionBlock = {
    print("op3 (?) completed")
}

let opsQue = OperationQueue()
opsQue.addOperations([op1, op2, op3], waitUntilFinished: false)

DispatchQueue.global().asyncAfter(deadline: .now()) {
    opsQue.cancelAllOperations()
}

Inshort Я хочу отменить вторую операцию из операцииQueue.

Пожалуйста, укажите мне .

Спасибо

Ответы [ 3 ]

2 голосов
/ 27 января 2020

Вы можете вызвать op2.cancel (), чтобы отменить операцию, но вам нужно предпринять дополнительные шаги, чтобы действительно остановить выполнение вашей операции, так как отмена () только устанавливает для свойства isCanceled значение true.

Пожалуйста, проверьте документ разработчика. https://developer.apple.com/documentation/foundation/operation/1408418-iscancelled

Значение по умолчанию для этого свойства - false. Вызов метода cancel () этого объекта устанавливает значение этого свойства в true. После отмены операция должна перейти в законченное состояние.

Отмена операции не останавливает выполнение кода получателя. Объект операции отвечает за периодический вызов этого метода и остановку самого себя, если метод возвращает значение true.

Вы должны всегда проверять значение этого свойства, прежде чем выполнять какую-либо работу по выполнению задачи операции, что обычно означает проверку на начало вашего собственного метода main (). Операция может быть отменена до ее начала или в любое время, когда она выполняется. Поэтому проверка значения в начале вашего метода main () (и периодически в течение всего этого метода) позволяет вам выйти как можно быстрее при отмене операции.

2 голосов
/ 28 января 2020

Надеюсь, вы ссылались на документацию для операции

Существует несколько KVO-Compliant свойств для операции наблюдения.

Есть одно свойство isCancelled - read-only

используется для проверки этого свойства перед выполнением операции

, например:

class myOperation2 : Operation {

    override func main() {

        print("op2 (?) working....")

        if self.isCancelled {
            return
        }

        for i in 1...10 {
            print("?")
        }
    }
}

и для отмены:

DispatchQueue.global().asyncAfter(deadline: .now()) {
    opsQue.operations[1].cancel()
}
2 голосов
/ 27 января 2020

opsQue.cancelAllOperations() в вашем коде вызывает удаление незапущенных операций из очереди и вызывает Operation.cancel() для каждой выполняемой операции, но только для isCancelled устанавливается true. Вы должны обращаться с этим явно

class myOperation2 : Operation {

    override func main() {

        print("op2 (?) working....")

        for i in 1...10 {
            if self.isCancelled { break } // cancelled, so interrupt
            print("?")
        }
    }
}
...