/ / AFHTTPRequest Operacja wsadowa w celu pobrania wielu plików - iphone, afnetworking

AFHTTPRequestOperation w partii, aby pobrać wiele plików - iphone, afnetworking

jako widziany jako ASIHTTP został uznany za przestarzały, w przypadku plikunowy projekt "Pracuję nad" Próbuję się nauczyć AFNetworking, ale mam do czynienia z pewnymi problemami, których nie jestem w stanie rozwiązać. Muszę pobrać wiele obrazów z mojej witryny, aby zapisać je lokalnie. Niestety te obrazy nie są samodzielnym serwerem przez serwer, ale są włączone do pliku plist, który wraz z danymi obrazu zwraca mi niektóre parametry

kod php, który wyświetla obraz, jest następujący

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

aby zarządzać żądaniem do tej strony serwera, którego użyłem tego kodu

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

}];

Ale nie mogę zapisać obrazu podczasblok postępu (ponieważ nie mam innych parametrów do bloku) i iteracja przez tablicę operacyjną może wymagać trochę pamięci, w przypadku, gdy obrazy są naprawdę ciężkie lub jest dużo stron. Czytałem, że ktoś sugeruje użycie

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

ale w tym przypadku nie mam bezpośredniego strumienia obrazu, ale wartość zawartą w pliku plist. Czy ktoś stanął przed tym problemem i jak go rozwiązał?

Odpowiedzi:

1 dla odpowiedzi № 1

Możesz ustawić completionBlock przy każdej operacji, aby zrobić wszystko, czego potrzebujesz, niezależnie od tego, czy to zapisywanie pliku responseData gdzieś lub co masz.

Zauważ, że nie ma gwarancji, że bloki uzupełniania dla wszystkich operacji zostaną zakończone do czasu zakończenia wsadu, więc nie należy polegać na tym w bloku uzupełniania wsadowego.


0 dla odpowiedzi nr 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.