2013-09-25 14 views
17

Próbuję wykonać połączenie sieciowe 2.0 i próbuję wymyślić sposób anulowania określonych zadań. Stary sposób byłoby użyć coś jakAFNetworking 2.0 anuluj konkretne zadanie

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

ale ja nie widzę czegoś takiego w 2,0

Stworzyłem klasę Sub AFHTTPSessionManager co daje mi dostęp do tablicy oczekujących zadań i mogę anuluj je bezpośrednio, ale nie wiem, jak rozpoznać jedno zadanie od drugiego, aby anulować tylko określone zadania. Zadanie ma identyfikator zadania, ale to nie wydaje się być tym, czego potrzebuję.

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

teraz, jeśli chcę anulować tę prośbę tylko w jaki sposób mam się do niej zbliżyć?

Odpowiedz

34

można zapisać zadanie w zmiennej, dzięki czemu można do niego dostęp później:

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

Następnie wystarczy odwołać go z [task cancel].

Innym sposobem byłoby zapisać identyfikator zadania zadania, a później poprosić sesję URL do swoich zadań i określić zadania, które chcesz anulować:

// save task ID 
_savedTaskID = task.taskIdentifier; 

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

@ phix23 żadnego pomysłu dlaczego [zadanie anulować] nadal jest wywołanie zwrotnego sukces kiedy anulowano? –

+0

Nie myślałem o zadeklarowaniu metody GET w NSURLSessionDataTask. Dziękuję Ci bardzo ! – JJBoursier

7

Nie ma potrzeby, aby go zapisać, tu jest mój wdrożenie, użyj podklasę AFURLSessionManager za anulowanie konkretny wniosek:

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

Ulepszone, ale co z ścieżkami, które są podłańcuchem innej ścieżki żądania? tj. "/ item/1" i "/ item/11" Anulowanie pozycji 1 również anulowałoby 11. Czy ścieżka '' '... URL]] nie byłaEqualToString: ścieżka]' '' byłoby lepszym porównaniem? –

+0

dziękuję za wskazanie tego ... Użyłem tego podejścia, więc jeśli użytkownik chce anulować wszystkie zadania w tym samym kontekście, można to zrobić łatwo, np. "/ School/class/students" anuluje wszystkie prośby o "/ school/class/students/id001 "do ..id100 również nie wprowadzają przerwy w pętli. Twój problem można rozwiązać za pomocą "/ item/01" i "/ item/11". W każdym razie porównanie można zmienić zgodnie z wymogiem. – Zaraki

+0

Niesamowite, dzięki! – marcelosalloum

0

można wykonać następujące

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

Gdzie MyClient jest dzieckiem AFHTTPClient a funkcja sharedClient jest statyczna funkcja, która zwraca singleton instancji MyClient

+0

Dziękujemy za obniżenie oceny, ale proszę podać powód udostępnienia wiedzy. – Saeed

+2

Prawdopodobnie dlatego, że twoje rozwiązanie używa 'AFHTTPClient', który jest tylko AFN 1.x. Pytanie dotyczyło AFN 2.0. – Koen