我的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中取消第二项操作。
请引导我。
谢谢
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("🐶")
}
}
}
isCanceled属性设置为true。
请检查开发者文档。https://developer.apple.com/documentation/foundation/operation/1408418-iscancelled此属性的默认值为false。调用此对象的cancel()方法会将此属性的值设置为true。一旦取消,操作必须移至完成状态。取消操作不会主动阻止执行接收方的代码。一个操作对象负责定期调用此方法,并在该方法返回true时自行停止。
您在执行任何操作来完成该操作的任务之前,应始终检查此属性的值,这通常意味着在自定义main()方法开始时对其进行检查。有可能在操作开始执行之前或执行期间的任何时间取消该操作。因此,在main()方法开始时检查该值(并在该方法中定期检查该值)可以使您在取消操作时尽快退出。
有几个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() }