/ / AFHTTPRequestOperation in un batch per scaricare più file - iphone, afnetworking

AFHTTPRequestOperation in un batch per scaricare più file - iphone, afnetworking

visto che ASIHTTP è stato deprecato, per anuovo progetto su cui sto lavorando sto cercando di imparare AFNetworking ma sto affrontando alcuni problemi che non sono in grado di risolvere. ho la necessità di scaricare molte immagini dal mio sito Web per salvarle localmente. Purtroppo queste immagini non sono server standalone dal server ma sono incorporate in un plist che, con i dati dell'immagine, mi restituisce alcuni parametri

il codice php che serve l'immagine è questo

$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));

per gestire la richiesta a questa pagina del server ho usato questo codice

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

}];

Ma non sono in grado di salvare l'immagine durante ilblocco di avanzamento (come se non ho altri parametri per il blocco) e scorrere attraverso l'array di operazioni potrebbe richiedere un po 'di memoria, nel caso in cui le immagini siano molto pesanti o ci siano molte pagine. ho letto che qualcuno suggerisce di usare il

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

ma in questo caso non ho un flusso diretto dell'immagine ma un valore contenuto in un plist. Qualcuno ha affrontato questo problema e come lo ha risolto?

risposte:

1 per risposta № 1

Puoi impostare completionBlock su ciascuna delle operazioni per fare tutto ciò di cui hai bisogno, sia che si tratti di salvare il file responseData da qualche parte, o cosa hai.

Si noti che non esiste alcuna garanzia che i blocchi di completamento per tutte le operazioni saranno completati entro il completamento del batch, quindi non dipendere da quello nel blocco di completamento del batch.


0 per risposta № 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.