2013-09-25 17 views
17

Sadece 2.0 çalışıyorum ve belirli görevleri nasıl iptal edeceğinizi anlamaya çalışıyorum. eski yoluAFNetworking 2.0 belirli bir görevi iptal et

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

gibi bir şey kullanmak olacaktır ama ben bekleyen görev ve elimden dizisi beni erişim sağlar AFHTTPSessionManager bir alt sınıfını oluşturdu 2.0

böyle bir şey görmüyorum Onları doğrudan iptal edebilirim ancak bir başkasından 1 görevi nasıl tanımlayacağımı bilmiyorum, böylece yalnızca belirli görevleri iptal edebilirim. Görevde bir taskidentifier var, ancak ihtiyacım olan şey bu değil.

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

Bu isteği iptal etmek istesem şimdi buna nasıl yaklaşırdım? daha sonra erişebilmek

cevap

34

Bir değişkende görevi saklayabilirsiniz:

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

Sonra basitçe [task cancel] ile iptal edebilirsiniz.

başka yolu da görevin görev kimliğini kaydedebilir ve daha sonra onun görevler için URL oturumu sormak ve iptal etmek istediğiniz görevi tanımlamak olacaktır:

// save task ID 
_savedTaskID = task.taskIdentifier; 

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

bir tekil örneğini döndüren bir statik fonksiyonudur iptal edildiğinde? –

+0

Bir NSURLSessionDataTask'ta GET yöntemini bildirmeyi düşünmedim. Çok teşekkür ederim ! – JJBoursier

7

kaydetmek gerek yok, burada benim olayım

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

Yükseltme, ancak başka bir istek yolunun alt dizesi olan yollar nedir? yani "/ item/1" ve "/ item/11" 1. maddeyi iptal etmek de 11'i iptal ederdi. '' '... URL] yolu] isEqualToString: yol]' '' daha iyi bir karşılaştırma mı? –

+0

bunu işaret ettiğin için teşekkürler ... Bu yaklaşımı kullandım, böylece bir kullanıcı aynı bağlamda tüm görevleri iptal etmek istiyorsa kolayca yapılabilir, yani "/ school/class/students" "/ school" için tüm istekleri iptal edebilir/class/students/id001 "to ..id100 böylece de döngüde bir mola vermedi. Sorununuz "/ item/01" ve "/ item/11" ile ele alınabilir. Her neyse, karşılaştırma gereksinime göre değiştirilebilir. – Zaraki

+0

Harika, teşekkürler! – marcelosalloum

0

aşağıdaki

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]; 
     } 
    } 
} 
yapabilirsiniz: uygulanması, belirli bir isteği iptal edilmesi için AFURLSessionManager sizin alt sınıfını kullanmak MyClient AFHTTPClient çocuğuyum ve fonksiyon sharedClient olduğunu

[görev iptal] neden hala başarı geri arama çağırıyor phix23 herhangi fikri @MyClient

+0

Reddetme için teşekkürler, ancak lütfen bilgileri paylaşma nedenini belirtin. – Saeed

+2

Muhtemelen çözümünüz sadece AFN 1.x olan 'AFHTTPClient' kullandığı için. Soru AFN 2.0 içindi. – Koen

İlgili konular