/ / AFHTTPRequestOperation dans un lot pour télécharger plusieurs fichiers - iphone, afnetworking

AFHTTPRequestOperation dans un lot pour télécharger plusieurs fichiers - iphone, afnetworking

comme vu que ASIHTTP a été déprécié, pour unenouveau projet je travaille sur i "j'essaie d'apprendre AFNetworking mais je" suis confronté à des problèmes que je "ne suis pas en mesure de résoudre. J'ai besoin de télécharger de nombreuses images de mon site Web pour les enregistrer localement. Malheureusement, ces images ne sont pas autonomes par le serveur mais sont intégrées dans une liste qui, avec les données d'image, me renvoie certains paramètres

le code php qui sert l'image est-ce

$plist = new CFPropertyList();
$plist->add($maindict = new CFdictionary());
$maindict->add("foldername",new CFString($fol_name));
$file_ext = ($fol_name == "iPhoneRetina") ? "@2x.png" : ".png";
$file_path = "1";
$imgfile = __DIR__."/documents/".$file_path."/".$fol_name."/doc_".$file_path."_pagina_".$page_nr.$file_ext;
$imgbinary = fread(fopen($imgfile, "r"), filesize($imgfile));
$maindict->add("image",new CFData($imgbinary));
$maindict->add("page_nr",new CFNumber($page_nr));
$maindict->add("document_id",new CFNumber($doc_id));

pour gérer la requête vers cette page du serveur j'ai utilisé ce code

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:downloadURL];
NSDictionary *params;
AFHTTPRequestOperation *operation;
for (int x = 0; x < 10; x++) {
params = @{
@"page_nr" : [NSNumber numberWithInt:x],
@"doc_id" : @1,
};
NSMutableURLRequest *request = [client requestWithMethod:@"POST" path:@"/getMagazinePage.php" parameters:params];
operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[tempOperations addObject:operation];
}
[client enqueueBatchOfHTTPRequestOperations:tempOperations
progressBlock:^(NSUInteger numberOfCompletedOperations, NSUInteger totalNumberOfOperations) {
dispatch_async(dispatch_get_main_queue(), ^{
[cell setDownloadProgress:(float)numberOfCompletedOperations/(float)totalNumberOfOperations];
});

} completionBlock:^(NSArray *operations) {
[cell setDownloaded:YES];
/*                                      for (AFHTTPRequestOperation *ro in operations) {

if (ro.error) {

NSLog(@"++++++++++++++ Operation error");

}else {
//NSLog(@"Operation OK: %@", [ro.responseData description]);
}
}*/

}];

Mais je ne suis pas en mesure d'enregistrer l'image pendant labloc de progression (comme parce que je n'ai pas d'autres paramètres pour le bloc) et itérer à travers le tableau d'opérations peut consommer un peu de mémoire, au cas où les images sont vraiment lourdes ou qu'il y a beaucoup de pages. J'ai lu que quelqu'un suggère d'utiliser le

operation.outputStream = [NSOutputStream outputStreamToFileAtPath:@"download.zip" append:NO];

mais dans ce cas je n'ai pas de flux direct de l'image mais une valeur contenue dans un plist. Quelqu'un est-il confronté à ce problème et comment l'a-t-il résolu?

Réponses:

1 pour la réponse № 1

Vous pouvez définir completionBlock sur chacune des opérations pour faire tout ce dont vous avez besoin, que ce soit responseData quelque part, ou qu'avez-vous.

Notez qu'il n'y a aucune garantie que les blocs d'achèvement pour toutes les opérations seront terminés au moment où le lot se termine, donc ne dépendez pas de cela dans le bloc d'achèvement du lot.


0 pour la réponse № 2
// You need this line to download the file directly to the path above, as you pointed out
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO];

// Within the completion block, you can have some thing like
NSString *contentDisposition = [[operation.response allHeaderFields] objectForKey:@"Content-Disposition"];

and within contentDisposition string you will have the file name etc. That way, you will know the file name to save.