AFNetworking 2.0 отменяет определенную задачу

17

Я пробовал 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);
        }];

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

    
задан glogic 25.09.2013 в 11:44
источник

3 ответа

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];
    }
}
    
ответ дан Felix 25.09.2013 в 14:00
источник
  • @ phix23 любая идея, почему [отмена задачи] все еще вызывает обратный вызов успеха при отмене? –  Ryan Romanchuk 17.03.2014 в 01:13
  • Я не думал об объявлении метода GET в NSURLSessionDataTask. Большое спасибо ! –  JJBoursier 24.03.2014 в 11:46
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];
        }
    }
}
    
ответ дан Zaraki 11.12.2013 в 10:49
источник
  • Up-voted, но как насчет путей, которые являются подстрокой другого пути запроса? то есть «/ item / 1» и «/ item / 11» Отмена элемента 1 также отменит 11. Не будет ли ... URL] путь] isEqualToString: путь] лучше сравнивать? –  John Lemberger 24.01.2014 в 17:07
  • благодарю вас за указание на это ... Я использовал этот подход, чтобы, если пользователь хочет отменить все задачи с одним и тем же контекстом, это может быть сделано легко, т.е. «/ school / class / students» отменит все запросы на " / school / class / students / id001 "to ..id100, таким образом, также не помещали перерыв в цикле. Ваша проблема может быть решена с помощью «/ item / 01» и «/ item / 11». В любом случае сравнение может быть изменено в соответствии с требованием. –  Zaraki 28.01.2014 в 08:01
  • Awesome, спасибо! –  marcelosalloum 10.08.2016 в 00:36
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     

ответ дан Saeed 08.04.2014 в 21:51
источник
  • Благодарим вас за понижение, но, пожалуйста, укажите причину поделиться знаниями. –  Saeed 06.08.2014 в 05:22
  • Возможно, потому, что ваше решение использует AFHTTPClient, который является только AFN 1.x. Вопрос был в отношении AFN 2.0. –  Koen 03.10.2014 в 17:06