我排队
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
我将队列发送到我的异步请求
[NSURLConnection sendAsynchronousRequest:req queue:operationQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
// ... do stuff here
});
}];
我提前取消了我的操作
[operationQueue cancelAllOperations];
但是,我可以看到我的async的“完成”代码仍在运行。为什么这种情况不像我预期的那样有效?
答案 0 :(得分:1)
cancelAllOperations
浏览队列中的项目并在每个项目上调用cancel
。如果您查看completionBlock
的文档:
当isFinished方法返回的值更改为YES时,将执行您提供的完成块。因此,在操作的主要任务完成或取消后,操作对象将执行此块。
可以看到here
编辑:
setCompletionBlock:
完成的操作可能因为已取消或成功完成其任务而结束。在编写块代码时,您应该考虑这一事实。同样,您不应对依赖操作的成功完成做出任何假设,这些操作本身可能已被取消。
答案 1 :(得分:1)
在操作过程中检查isCancelled
是否有责任,以防它被中途取消?
NSOperationQueue不会只是杀死任务,它会将它们设置为已取消并让它们自己完成。这使您可以在退出之前清理可能已分配和整理的所有资源。
尚未开始的任务将无法启动。