我如何迅速从OperationQueue取消特定的操作

问题描述 投票:0回答:3

我的OperationQueue中有3个操作,我无法从中取消特定操作。

我提到了这个例子,但我听不懂NSOperationQueue cancel specific operations

这是我的代码

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()
}

简而言之,我想从operationQueue中取消第二项操作。

请引导我。

谢谢

ios swift nsoperationqueue nsoperation
3个回答
0
投票
代码中的[[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("🐶") } } }

0
投票
您可以调用op2.cancel()取消操作,但是您需要采取其他步骤来真正停止操作,因为cancel()仅将

isCanceled属性设置为true。

请检查开发者文档。https://developer.apple.com/documentation/foundation/operation/1408418-iscancelled

此属性的默认值为false。调用此对象的cancel()方法会将此属性的值设置为true。一旦取消,操作必须移至完成状态。

取消操作不会主动阻止执行接收方的代码。一个操作对象负责定期调用此方法,并在该方法返回true时自行停止。

您在执行任何操作来完成该操作的任务之前,应始终检查此属性的值,这通常意味着在自定义main()方法开始时对其进行检查。有可能在操作开始执行之前或执行期间的任何时间取消该操作。因此,在main()方法开始时检查该值(并在该方法中定期检查该值)可以使您在取消操作时尽快退出。


0
投票
希望您提到documentation for Operation

有几个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() }

© www.soinside.com 2019 - 2024. All rights reserved.