通过NSOperationQueue更好地理解NSURLConnection

时间:2012-06-19 15:46:38

标签: ios nsurlconnection nsoperationqueue sendasynchronousrequest

我排队

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的“完成”代码仍在运行。为什么这种情况不像我预期的那样有效?

2 个答案:

答案 0 :(得分:1)

cancelAllOperations浏览队列中的项目并在每个项目上调用cancel。如果您查看completionBlock的文档:

  

当isFinished方法返回的值更改为YES时,将执行您提供的完成块。因此,在操作的主要任务完成或取消后,操作对象将执行此块。

可以看到here

编辑:

setCompletionBlock:

文档中的另一个片段
  

完成的操作可能因为已取消或成功完成其任务而结束。在编写块代码时,您应该考虑这一事实。同样,您不应对依赖操作的成功完成做出任何假设,这些操作本身可能已被取消。

答案 1 :(得分:1)

在操作过程中检查isCancelled是否有责任,以防它被中途取消?

NSOperationQueue不会只是杀死任务,它会将它们设置为已取消并让它们自己完成。这使您可以在退出之前清理可能已分配和整理的所有资源。

尚未开始的任务将无法启动。