我有这段代码可以将一个NSOperation实例添加到队列中
let operation = NSBlockOperation()
operation.addExecutionBlock({
self.asyncMethod() { (result, error) in
if operation.cancelled {
return
}
// etc
}
})
operationQueue.addOperation(operation)
Run Code Online (Sandbox Code Playgroud)
当用户离开触发上述代码的视图时,我取消操作
operationQueue.cancelAllOperations()
Run Code Online (Sandbox Code Playgroud)
在测试取消时,我 100% 确定取消在异步方法返回之前正在执行,所以我希望operation.cancelled是真的。不幸的是,这并没有发生,我不明白为什么
我正在执行取消 viewWillDisappear
编辑
asyncMethod包含在不同线程中运行的网络操作。这就是回调存在的原因:处理网络操作返回。网络操作在类层次结构的深处执行,但我想在根级别处理 NSOperations。
调用此对象的取消方法将此属性的值设置为 YES。一旦取消,操作必须移动到完成状态。
取消操作不会主动停止接收者的代码执行。操作对象负责定期调用此方法,如果该方法返回 YES,则停止自身。
在为完成操作的任务而做任何工作之前,您应该始终检查此属性的值,这通常意味着在自定义 main 方法的开头检查它。可以在操作开始执行之前或执行期间的任何时间取消操作。因此,检查主方法开始时的值(并在整个方法中定期检查)可以让您在取消操作时尽快退出。
import Foundation
let operation1 = NSBlockOperation()
let operation2 = NSBlockOperation()
let queue = NSOperationQueue()
operation1.addExecutionBlock { () -> Void in
repeat {
usleep(10000)
print(".", terminator: "")
} while !operation1.cancelled
}
operation2.addExecutionBlock { () -> Void in
repeat {
usleep(15000)
print("-", terminator: "")
} while !operation2.cancelled
}
queue.addOperation(operation1)
queue.addOperation(operation2)
sleep(1)
queue.cancelAllOperations()
Run Code Online (Sandbox Code Playgroud)
在操场上试试这个简单的例子。
如果运行另一个异步代码真的很重要,试试这个
operation.addExecutionBlock({
if operation.cancelled {
return
}
self.asyncMethod() { (result, error) in
// etc
}
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5057 次 |
| 最近记录: |