not found example afhttprequestoperationmanager afhttprequestoperation ios afnetworking afnetworking-2

ios - found - alamofire



AFNetworking 2.0 cancela tarea especĂ­fica (3)

Estoy probando afnetworking 2.0 y solo estoy tratando de averiguar cómo cancelar tareas específicas. La forma antigua sería usar algo como

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

Pero no veo nada como esto en 2.0

AFHTTPSessionManager una subclase de AFHTTPSessionManager que me da acceso al conjunto de tareas pendientes y puedo cancelarlas directamente, pero no sé cómo identificar una tarea de otra para poder cancelar solo tareas específicas. La tarea tiene un identificador de tarea pero esto no parece ser lo que necesito.

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

Ahora, si quisiera cancelar esta solicitud solo, ¿cómo abordaría esto?


No es necesario guardarlo, aquí está mi implementación, use su subclase de AFURLSessionManager para cancelar una solicitud específica:

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


Puede almacenar la tarea en una variable para poder acceder a ella más adelante:

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

Entonces simplemente cancele con [task cancel] .

Otra forma sería guardar el ID de tarea de la tarea y luego preguntar a la sesión de URL para sus tareas e identificar la tarea que desea cancelar:

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


puedes hacer lo siguiente

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

Donde MyClient es un hijo de AFHTTPClient y la función sharedClient es una función estática que devuelve una instancia única de MyClient