Подтвердить что ты не робот

AFNetworking 2: Как отменить запрос AFHTTPRequestOperationManager?

Я перенесла свои сетевые функции от AFNetworking до AFNetworking v2, а вместо AFHttpClient я использую AFHTTPRequestOperationManager для поддержки iOS6.

Моя проблема в том, что, хотя в AFHttpClient существовала возможность отменить ожидающий запрос с помощью

- (void)cancelAllHTTPOperationsWithMethod:(NSString *)method path:(NSString *)path;

в AFHTTPRequestOperationManager такого очевидного метода нет.

То, что я сделал до сих пор, - это подклассификация AFHTTPRequestOperationManager и объявление iVar

AFHTTPRequestOperation *_currentRequest;

Когда я делаю запрос, код выглядит как

- (void)GetSomething:(NSInteger)ID success:(void (^)(MyResponse *))success failure:(void (^)(NSError *))failure
{
    _currentRequest = [self GET:@"api/something" parameters:@{@"ID": [NSNumber numberWithInteger:ID]} success:^(AFHTTPRequestOperation *operation, id responseObject) {
        MyResponse *response = [MyResponse responseFromDictionary:responseObject];
        success(response);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        failure(error);

    }];
}

и у меня есть

- (void)cancelCurrentRequest;

которые все, что делает,

- (void)cancelCurrentRequest
{
    if(_currentRequest) {
        [_currentRequest cancel]; _currentRequest = nil;
    }
}

Теперь я не думаю, что это хорошая практика, и когда метод вызван, я получаю (NSURLErrorDomain error -999.), поэтому мне нужен совет, чтобы сделать это правильно.

Спасибо заранее.

4b9b3361

Ответ 1

[manager.operationQueue cancelAllOperations];

Ответ 2

У вас нет подкласса AFHTTPRequestOperationManager, потому что когда вы отправляете запрос, AFHTTPRequestOperation возвращается из

- (AFHTTPRequestOperation *)GET:(NSString *)URLString
                     parameters:(id)parameters
                        success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
                        failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure

просто сохраните его где-нибудь или сделайте статичным, а затем выполните cancel, когда запрос нужно отменить.

Пример:

- (void)sendRequestToDoSomething
{
   static AFHTTPRequestOperation *operation;
   if(operation) //cancel operation if it is running
       [operation cancel];
   AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  //configure manager here....

operation = [manager GET:urlString parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
   //do something here with the response
   operation = nil;
} failure:^(AFHTTPRequestOperation *op, NSError *error) {
{
   //handle error
   operation = nil;
}