如何使用AFNetworking立即强制取消NSOperation?

Ant*_*ony 3 cocoa-touch objective-c nsoperation afnetworking

我在我的应用程序中使用AFNetworking,我正在尝试在我的进度HUD中实现"点按取消"功能.我有一个管理所有HTTP请求的单例类.如果点击进度HUD,我打电话:

[[[HTTPRequestSingleton sharedClient] operationQueue] cancelAllOperations];
Run Code Online (Sandbox Code Playgroud)

但这并不像我需要的那样"取消"操作.我阅读了NSOperationQueue文档并发现了这个:

取消操作对象会将对象留在队列中,但会通知对象它应该尽快中止其任务.对于当前正在执行的操作,这意味着操作对象的工作代码必须检查取消状态,停止它正在执行的操作,并将自己标记为已完成.对于排队但尚未执行的操作,队列仍必须调用操作对象的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

}];
Run Code Online (Sandbox Code Playgroud)

Ant*_*ony 9

经过一整天的AFNetworking源代码挖掘后,事实证明我的操作没有取消的原因与操作本身无关,而是因为我一直在错误地开始操作.我一直在用

[NSOperation start];
Run Code Online (Sandbox Code Playgroud)

什么时候我应该把它添加到我HTTPRequestSingleton的操作队列中:

[[[HTTPRequestSingleton sharedClient] operationQueue] addOperation:NSOperation];
Run Code Online (Sandbox Code Playgroud)

将其添加到队列允许它被正确取消而无需检查isCancelled属性.