2013-11-22 4 views
36

Ich habe meine Netzwerkfunktionalität von AFNetworking zu AFNetworking v2 migriert und anstelle von AFHttpClient verwende ich AFHTTPRequestOperationManager, um auch iOS6 zu unterstützen.AFNetworking 2: Wie man eine AFHTTPRequestOperationManager Anfrage abbricht?

Mein Problem ist, dass, während in AFHttpClient dort die Funktionalität war eine ausstehende Anforderung abzubrechen die Methode

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

Verwendung in den AFHTTPRequestOperationManager es nicht so offensichtlich Methode.

Was habe ich jetzt getan bis zu ist Subklassen AFHTTPRequestOperationManager und erklärt eine iVar

AFHTTPRequestOperation *_currentRequest; 

Wenn ich einen Antrag machen, ist der Code so etwas wie

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

    }]; 
} 

und ich habe eine

- (void)cancelCurrentRequest; 

Methoden, die das alles tut, ist

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

, ich glaube nicht, die gute Praxis ist, und wenn die Methode aufgerufen wird, bekomme ich (NSURLErrorDomain error -999.), weshalb ich einen Rat brauche auf immer dies richtig gemacht.

Vielen Dank im Voraus.

Antwort

79
[manager.operationQueue cancelAllOperations]; 
+3

Thx für die Antwort. Ich habe das bemerkt, aber was ist, wenn Sie eine bestimmte GET/POST-Anfrage abbrechen wollen? – ozzotto

+3

Wenn Sie sich die Implementierung von cancelAllHTTPOperationsWithMethod: path ansehen, finden Sie, wie Sie es tun. Es werden nur alle Operationen in operationQueue wiederholt, um diejenigen zu finden, die der Methode und dem Pfad entsprechen, und sie abzubrechen. Der Grund, warum sie sie in V2 entfernen, denke ich, dass sie denken, dass es nicht notwendig ist, eine bestimmte Operation abzubrechen? –

+0

Das habe ich getan. Eine Implementierung von cancelAllHTTPOperationsWithMethod: Pfad in meiner AFHTTPRequestOperationManager-Unterklasse. Danke Kumpel. – ozzotto

2

Sie müssen AFHTTPRequestOperationManager keine Unterklasse, weil, wenn Sie Anfrage senden, AFHTTPRequestOperation kehrt von der

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

einfach irgendwo speichern oder statisch machen und dann cancel durchführen, wenn die Anforderung sein müssen abgebrochen.

Beispiel:

- (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; 
} 
Verwandte Themen