2013-09-25 4 views
17

Я пробовал afnetworking 2.0 и просто пытался выяснить, как отменить определенные задачи. старый путь будет использовать что-то вродеAFNetworking 2.0 отменить конкретную задачу

[self cancelAllHTTPOperationsWithMethod:@"POST" path:@"user/receipts"] 

но я не вижу ничего подобного в 2,0

Я создал вспомогательный класс AFHTTPSessionManager, который дает мне доступ к массиву отложенных заданий и я могу отмените их напрямую, но я не знаю, как идентифицировать одну задачу от другой, поэтому я могу отменить только определенные задачи. Задача имеет идентификатор задачи, но это не похоже на то, что мне нужно.

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

сейчас, если бы я хотел отменить этот запрос только, как бы я подошел к этому?

ответ

34

Вы можете сохранить задачу в переменной, так что вы можете получить доступ к нему позже:

NSURLSessionDataTask* task = [self GET:path parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { 
      completionBlock(responseObject); 
     } failure:^(NSURLSessionDataTask *task, NSError *error) { 
      errorBlock(error); 
     }]; 

Тогда просто отменить его с [task cancel].

Другой способ сохранить идентификатор задачи задания, а затем задать URL-сессию для своих задач и определить задачу, которую вы хотите отменить:

// save task ID 
_savedTaskID = task.taskIdentifier; 

// cancel specific task 
for (NSURLSessionDataTask* task in [self dataTasks]) { 
    if (task.taskIdentifier == _savedTaskID) { 
     [task cancel]; 
    } 
} 
+1

@ phix23 любая идея, почему [задача отменить] по-прежнему вызывая функцию обратного вызова успеха при отмене? –

+0

Я не думал об объявлении метода GET в NSURLSessionDataTask. Большое спасибо ! – JJBoursier

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

Проголосовали, но как насчет путей, которые являются подстрокой другого пути запроса? то есть «/ item/1» и «/ item/11» Отмена элемента 1 также отменяет 11. Не будет ли «путь« ... URL]] isEqualToString: path] '' 'лучше сравнивать? –

+0

благодарю вас за указание на это ... Я использовал этот подход, чтобы, если пользователь хочет отменить все задачи в одном контексте, это можно сделать легко, т.е. «/ school/class/students» отменит все запросы на «/ school/class/students/id001 "to ..id100, таким образом, также не помещали перерыв в цикле. Ваша проблема может быть решена с помощью «/ item/01» и «/ item/11». В любом случае сравнение может быть изменено в соответствии с требованием. – Zaraki

+0

Удивительный, спасибо! – marcelosalloum

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

+0

Благодарим вас за понижение, но, пожалуйста, укажите причину поделиться знаниями. – Saeed

+2

Возможно, потому что ваше решение использует 'AFHTTPClient', который является только AFN 1.x. Вопрос был в отношении AFN 2.0. – Koen