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.
[manager.operationQueue cancelAllOperations];
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;
}