【发布时间】:2012-09-11 02:12:53
【问题描述】:
我正在我的应用程序中使用 AFNetworking,并且我正在尝试在我的进度 HUD 中实现“点击取消”功能。我有一个管理所有 HTTP 请求的单例类。如果点击进度HUD,我会调用:
[[[HTTPRequestSingleton sharedClient] operationQueue] cancelAllOperations];
但这不会像我需要的那样“取消”操作。我阅读了NSOperationQueue docs 并遇到了这个:
取消操作对象会使对象留在队列中,但会通知对象它应该尽快中止其任务。对于当前正在执行的操作,这意味着操作对象的工作代码必须检查取消状态,停止正在执行的操作,并将自身标记为已完成。对于已排队但尚未执行的操作,队列仍必须调用操作对象的 start 方法,以便它可以处理取消事件并将自己标记为已完成。
关于cancelAllOperations 方法:
此方法向当前队列中的所有操作发送取消消息。排队的操作在开始执行之前被取消。如果某个操作已经在执行,则由该操作来识别取消并停止它正在执行的操作。
我的问题似乎特别涉及已经执行的操作,我想立即取消它。使用 AFNetworking,我如何提醒操作它应该取消并丢弃有关请求的所有信息?
用于操作的代码
AFJSONRequestOperation *loginOperation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
//operation was successful
if (loginOperation.isCancelled)
{
//can't do this. variable 'loginOperation' is uninitialized when captured by block
}
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
//operation failed
}];
【问题讨论】:
-
操作没有立即终止到底是什么问题?
-
操作照常继续,
success:块被调用。如果操作被取消,我想找到一种方法来禁止调用该块。 -
顺便说一句:您可以使用 NSError 实例检查请求是否由于回调中的取消而失败,如下所示:[错误代码] == NSURLErrorCancelled。
标签: objective-c cocoa-touch nsoperation afnetworking