web-dev-qa-db-fra.com

AFNetworking 2: Comment annuler une demande AFHTTPRequestOperationManager?

J'ai migré ma fonctionnalité de mise en réseau de AFNetworking vers AFNetworking v2 et au lieu de AFHttpClient j'utilise AFHTTPRequestOperationManager pour prendre en charge iOS6 également.

Mon problème est que, dans AFHttpClient, il y avait la fonctionnalité pour annuler une demande en attente à l'aide du

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

, dans la AFHTTPRequestOperationManager il n'y a pas de méthode aussi évidente.

Ce que j'ai fait jusqu'à présent est de sous-classer AFHTTPRequestOperationManager et de déclarer un iVar

AFHTTPRequestOperation *_currentRequest;

Quand je fais une demande, le code est quelque chose comme

- (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);

    }];
}

et j'ai un

- (void)cancelCurrentRequest;

des méthodes qui ne font que

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

Maintenant, je ne pense pas que ce soit une bonne pratique et lorsque la méthode est appelée, j'obtiens (NSURLErrorDomain error -999.) c'est pourquoi j'ai besoin de quelques conseils pour que cela se fasse correctement.

Merci d'avance.

37
ozzotto
[manager.operationQueue cancelAllOperations];
80
Gary Lyn

Vous n'avez pas besoin de sous-classe AFHTTPRequestOperationManager, car lorsque vous envoyez une demande, AFHTTPRequestOperation revient de la

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

il suffit de l'enregistrer quelque part ou de le rendre statique, puis d'exécuter cancel lorsque la demande doit être annulée.

Exemple:

- (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;
}
2
David