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);
}];
теперь, если бы я хотел отменить этот запрос только, как бы я подходил к этому?
Ответы
Ответ 1
Вы можете сохранить задание в переменной, чтобы впоследствии получить к ней доступ:
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];
}
}
Ответ 2
Не нужно его сохранять, вот моя реализация, используйте свой подкласс 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];
}
}
}
Ответ 3
вы можете сделать следующее
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