1

我排队

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];

但是,我可以看到我的异步“完成”代码仍在运行。为什么这种情况不像我预期的那样工作?

4

2 回答 2

1

cancelAllOperations遍历队列中的项目并调用cancel每个项目。如果您查看以下文档completionBlock

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

可以在这里看到

编辑:

文档中的另一个片段setCompletionBlock:

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

于 2012-06-19T15:52:19.680 回答
1

如果它在中途被取消,难道不是你的责任isCancelled在你的操作任务期间检查吗?

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

尚未开始的任务将不会开始。

于 2012-06-19T15:59:18.640 回答