2013-09-25 4 views
17

afnetworking 2.0을 시험해보고 특정 작업을 취소하는 방법을 찾으려고합니다. 오래된 방법은AFNetworking 2.0 특정 작업 취소

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

같은 것을 사용하는 것입니다하지만 난 계류중인 작업과 내가 할 수의 배열에 나에게 액세스를 제공 AFHTTPSessionManager의 하위 클래스를 생성 2.0

이 같은 아무것도 볼 해달라고 그들을 직접 취소하지만 나는 특정 작업 만 취소 할 수 있으므로 다른 작업에서 1 작업을 식별하는 방법을 모릅니다. 작업에는 taskidentifier가 있지만이 작업은 내가 필요한 것으로 보입니다.

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

이 요청을 취소하려면 어떻게해야합니까? 나중에 액세스 할 수 있도록

답변

34

당신은 변수에 작업을 저장할 수 있습니다 :

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

그런 다음 단순히 [task cancel] 그것을 취소 할 수 있습니다.

또 다른 방법은 작업의 작업 ID를 저장하고 나중에 그 작업을위한 URL 세션을 요청하고 취소 할 작업을 식별하는 것입니다 :

// save task ID 
_savedTaskID = task.taskIdentifier; 

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

의 싱글 인스턴스를 반환하는 정적 기능입니다 취소 될 때? –

+0

NSURLSessionDataTask에서 GET 메서드를 선언 할 생각이 없습니다. 고마워요! – JJBoursier

7

저장 할 필요, 여기 내입니다

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

Up-voted이지만 다른 요청 경로의 하위 문자열 인 경로는 어떻게됩니까? "/ item/1"과 "/ item/11"항목을 취소하면 취소됩니다. 11. "..."URL] path isEqualToString : path]'''더 나은 비교일까요? –

+0

그 점을 지적 해 주셔서 고맙습니다 ... 나는 사용자가 같은 맥락으로 모든 작업을 취소하고 싶다면 쉽게 "/ 학교/수업/학생"이 "/ 학교"에 대한 모든 요청을 취소 할 수 있도록이 접근법을 사용했습니다/class/students/id001 "에서 ..id100까지는 루프에 중단을 두지 않았습니다. 문제는 "/ item/01"및 "/ item/11"을 사용하여 처리 할 수 ​​있습니다. 어쨌든 비교는 요구 사항에 따라 변경 될 수 있습니다. – Zaraki

+0

신난다, 고마워! – marcelosalloum

0

는 다음

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]; 
     } 
    } 
} 
작업을 수행 할 수 있습니다 구현은, 특정 요청을 취소하는 AFURLSessionManager의 하위 클래스를 사용 하여 MyClientAFHTTPClient의 자식과 기능 sharedClient입니다

는 [작업 취소] 왜 아직도 성공 콜백을 호출 phix23 어떤 생각 @하여 MyClient

+0

다운 그레이드 해 주셔서 감사합니다. 지식을 공유 할 이유를 지정해주십시오. – Saeed

+2

아마 솔루션에 AFN 1.x 인'AFHTTPClient'가 사용되기 때문일 것입니다. 문제는 AFN 2.0에 관한 것이 었습니다. – Koen