Comment rappend des opérations quand elles échouent en utilisant enqueueBatchOfHTTPRequestOperations de AFNetworking

J'ai une méthode qui télécharge une list de files d'un server Web vers un iPad en utilisant l'appel AFNetworking enqueueBatchOfHTTPRequestOperations. De time en time, j'obtiens une opération échouée (généralement lorsque le file est plus gros). Historiquement, j'ai téléchargé chaque file individuellement et j'ai simplement callbacké l'opération jusqu'à un certain nombre de tentatives.

J'ai refactored le code pour utiliser enqueueBatchOfHTTPRequestOperations. Cela fonctionne très bien, mais je ne sais pas comment get des notifications sur les échecs d'opérations "spécifiques" et je ne sais pas comment les append à la queue en cas d'échec.

Voici le code que j'utilise pour download "n" nombres de files:

NSMutableArray *operationsArray = [[NSMutableArray alloc]init]; for (MINPageDefinition *currPage in [[MINPageStore sharedInstance] pageArray]) { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSSsortingng *serverLibraryURL = [defaults objectForKey:kRootURL]; serverLibraryURL = [serverLibraryURL ssortingngByAppendingPathComponent:kPageDefinitionsDirectory]; serverLibraryURL = [serverLibraryURL ssortingngByAppendingPathComponent:currPage.pageImageName]; NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithSsortingng:serverLibraryURL]]; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; operation.outputStream = [NSOutputStream outputStreamToFileAtPath:currPage.pageImageURL append:NO]; [operationsArray addObject:operation]; } if ([operationsArray count] > 0) { AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithSsortingng:@""]]; void (^progressBlock)(NSUInteger numberOfCompletedOperations, NSUInteger totalNumberOfOperations) = ^(NSUInteger numberOfCompletedOperations, NSUInteger totalNumberOfOperations) { NSLog(@"%d proccesses completed out of %d", numberOfCompletedOperations, totalNumberOfOperations); }; void (^completionBlock)(NSArray *operations) = ^(NSArray *operations) { NSLog(@"All operations completed"); }; [client enqueueBatchOfHTTPRequestOperations:operationsArray progressBlock:progressBlock completionBlock:completionBlock]; } 

Avant, j'avais une méthode qui exécutait l'opération. En cas d'échec, le bloc d'échec s'appelle récursivement. Comment puis-je modifier ce code pour réessayer jusqu'à "n" nombre de fois si une opération échoue?

Vérifiez ci-dessous le code @justLearningAgain

 [[WfServices sharedClient] GET:kGetAddress parameters:dicParam success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"RESPONSE ::: %@",responseObject); }failure:^(AFHTTPRequestOperation *operation, NSError *error) { }]; + (WfServices *)sharedClient { static WfServices * _sharedClient = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _sharedClient = [[WfServices alloc] initWithBaseURL:[NSURL URLWithSsortingng:kWFBaseURLSsortingng]]; }); return _sharedClient; } 

Ne pouvez-vous pas simplement mettre en queue l'unique opération ayant échoué dans le bloc d'échec de cette opération comme cela?

 [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { } failure:^(AFHTTPRequestOperation *operation, NSError *error) { [[APIClient sharedClient] enqueueHTTPRequestOperation:operation]; }]; 

[APIClient sharedClient] est une reference à votre sous-class AFHTTPClient (singleton ou non).

Je pense que AFNetworking Auto-Retry peut être utile.

Ou vous pouvez replace la méthode suivante dans votre AFHTTPClient.

Considérons resumeTasksArray = tableau d'opérations que vous devez append à la queue.

 NSMutableArray *resumeTasksArray; before @implementation AFHTTPClient - (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)request success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure { void(^authFailBlock)(AFHTTPRequestOperation *opr, NSError *err) = ^(AFHTTPRequestOperation *opr, NSError *err){ [resumeTasksArray addObject:request]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ //now, queue up and execute the original task for (NSURLRequest *previousRequest in resumeTasksArray) { NSLog(@"^^^^^^^^^^^^^^^^^^^^^^^^^^^^Resume Task URL - %@", previousRequest.URL); NSMutableURLRequest *newRequest = [previousRequest mutableCopy]; [newRequest setValue:[NSSsortingng ssortingngWithFormat:@"Bearer %@", AppSingleton.access_token] forHTTPHeaderField:@"Authorization"]; AFHTTPRequestOperation *opera10n = [[AFHTTPRequestOperation alloc]initWithRequest:newRequest]; opera10n.responseSerializer = self.responseSerializer; [opera10n setCompletionBlockWithSuccess:success failure:failure]; if (![[self.operationQueue operations] containsObject:opera10n]) { [[self operationQueue] addOperation:opera10n]; [opera10n start]; } } [resumeTasksArray removeAllObjects]; }); }; AFHTTPRequestOperation *operation = [super HTTPRequestOperationWithRequest:request success:success failure:authFailBlock]; return operation; }