我正在尝试afnetworking 2.0并试图弄清楚如何取消特定任务。 旧的方法是使用像
这样的东西[self cancelAllHTTPOperationsWithMethod:@"POST" path:@"user/receipts"]
但我在2.0中看不到这样的东西
我创建了一个AFHTTPSessionManager
的子类,它允许我访问待处理任务的数组,我可以直接取消它们,但我不知道如何识别另一个任务,所以我只能取消特定的任务。
任务确实有一个taskidentifier,但这似乎不是我需要的。
NSString *path = [NSString stringWithFormat:@"user/receipts"];
[self.requestSerializer setAuthorizationHeaderFieldWithUsername:[prefs valueForKey:@"uuid"] password:self.store.authToken];
[self GET:path parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
completionBlock(responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
errorBlock(error);
}];
现在,如果我想取消此请求,我将如何处理此问题?
答案 0 :(得分:34)
您可以将任务存储在变量中,以便日后访问:
NSURLSessionDataTask* task = [self GET:path parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
completionBlock(responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
errorBlock(error);
}];
然后只需使用[task cancel]
取消它。
另一种方法是保存任务的任务ID,然后向URL会话询问其任务并确定您要取消的任务:
// save task ID
_savedTaskID = task.taskIdentifier;
// cancel specific task
for (NSURLSessionDataTask* task in [self dataTasks]) {
if (task.taskIdentifier == _savedTaskID) {
[task cancel];
}
}
答案 1 :(得分:7)
无需保存,这是我的实现,使用AFURLSessionManager的子类取消特定请求:
- (void)cancelAllHTTPOperationsWithPath:(NSString *)path
{
AFURLSessionManager * yourSessionManager = [self getSessionManager];
[[yourSessionManager session] getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {
[self cancelTasksInArray:dataTasks withPath:path];
[self cancelTasksInArray:uploadTasks withPath:path];
[self cancelTasksInArray:downloadTasks withPath:path];
}];
}
- (void)cancelTasksInArray:(NSArray *)tasksArray withPath:(NSString *)path
{
for (NSURLSessionTask *task in tasksArray) {
NSRange range = [[[[task currentRequest]URL] absoluteString] rangeOfString:path];
if (range.location != NSNotFound) {
[task cancel];
}
}
}
答案 2 :(得分:0)
您可以执行以下操作
NSArray *operations = [[[MyClient sharedClient] operationQueue] operations];
if(operations && operations.count > 0){
for (NSOperation *operation in operations) {
if([operation isKindOfClass:[AFHTTPRequestOperation class]]){
AFHTTPRequestOperation *httpOperation = (AFHTTPRequestOperation *)operation;
NSLog(@"%@", [[httpOperation request] URL]);
//--- if this is your request then cancel it --> [httpOperation cancel];
}
}
}
MyClient 是 AFHTTPClient 的子项,函数 sharedClient 是一个静态函数,它返回 MyClient <的单例实例/强>