2013-09-25 37 views
17

Tôi đang cố gắng tạo mạng 2.0 và chỉ cố gắng tìm ra cách hủy các tác vụ cụ thể. Cách cũ sẽ được sử dụng một cái gì đó giống nhưAFNetworking 2.0 hủy tác vụ cụ thể

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

nhưng tôi không nhìn thấy bất cứ điều gì như thế này trong 2,0

Tôi tạo ra một lớp con của AFHTTPSessionManager mà mang lại cho tôi truy cập vào các mảng nhiệm vụ cấp phát và tôi có thể hủy bỏ chúng trực tiếp nhưng tôi không biết làm thế nào để xác định 1 nhiệm vụ từ người khác vì vậy tôi có thể hủy bỏ chỉ nhiệm vụ cụ thể. Tác vụ có một bộ định danh nhưng điều này dường như không phải là thứ tôi cần.

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

bây giờ nếu tôi muốn hủy yêu cầu này chỉ cách tiếp cận thông tin này?

Trả lời

34

Bạn có thể lưu trữ các nhiệm vụ trong một biến, do đó bạn có thể truy cập vào nó sau:

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

Sau đó chỉ cần hủy bỏ nó với [task cancel].

Một cách khác sẽ được lưu ID nhiệm vụ của nhiệm vụ và sau đó yêu cầu phiên URL cho nhiệm vụ của mình và xác định các nhiệm vụ bạn muốn hủy:

// save task ID 
_savedTaskID = task.taskIdentifier; 

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

@ phix23 ý tưởng bất kỳ lý do tại sao [nhiệm vụ hủy] vẫn gọi callback thành công khi bị hủy? –

+0

Tôi không nghĩ đến việc khai báo phương thức GET trong NSURLSessionDataTask. Cảm ơn nhiều ! – JJBoursier

7

Không cần phải lưu nó, đây là của tôi thực hiện, sử dụng lớp con lại AFURLSessionManager cho hủy yêu cầu cụ thể:

- (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-bình chọn, nhưng những gì về đường dẫn là một chuỗi con của một đường dẫn yêu cầu khác? nghĩa là "/ item/1" và "/ item/11" Hủy mục 1 cũng sẽ hủy 11. Đường dẫn URL '' '...]] isEqualToString: đường dẫn]' '' là so sánh tốt hơn? –

+0

cảm ơn bạn đã chỉ ra điều đó ... Tôi đã sử dụng phương pháp này để nếu người dùng muốn hủy tất cả các nhiệm vụ có cùng ngữ cảnh, có thể dễ dàng thực hiện "/ trường/lớp/sinh viên"./class/students/id001 "to ..id100 do đó cũng không đặt dấu ngắt trong vòng lặp. Vấn đề của bạn có thể được xử lý bằng cách sử dụng "/ item/01" và "/ item/11". Dù sao việc so sánh có thể được thay đổi theo yêu cầu. – Zaraki

+0

Tuyệt vời, cảm ơn! – marcelosalloum

0

bạn có thể làm như sau

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

đâu MyClient là con của AFHTTPClient và chức năng sharedClient là một chức năng tĩnh mà trả về một trường hợp singleton của MyClient

+0

Cảm ơn bạn đã hạ cấp, nhưng vui lòng nêu rõ lý do chia sẻ kiến ​​thức. – Saeed

+2

Có thể vì giải pháp của bạn sử dụng 'AFHTTPClient', chỉ AFN 1.x. Câu hỏi đặt ra cho AFN 2.0. – Koen