/ / AFHTTPRequestOperation in einem Stapel zum Herunterladen mehrerer Dateien - iphone, afnetworking

AFHTTPRequestOperation in einem Stapel zum Herunterladen mehrerer Dateien - iPhone, afnetworking

wie zu sehen, wie ASIHTTP für a abgelehnt wurdeNeues Projekt, an dem ich arbeite Ich versuche AFNetworking zu lernen, aber ich habe Probleme, die ich nicht lösen kann. Ich muss viele Bilder von meiner Website herunterladen, um sie lokal zu speichern. Leider sind diese Bilder vom Server nicht eigenständig, sondern werden in eine Liste eingefügt, mit der die Bilddaten an mich zurückgegeben werden

Der PHP-Code, der das Bild liefert, ist dies

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

Um die Anfrage an diese Seite des Servers zu verwalten, habe ich diesen Code verwendet

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

}];

Ich kann das Bild jedoch nicht speichernFortschrittsblock (da ich keine anderen Parameter für den Block habe) und durch das Operationsarray iterieren kann ein wenig Speicherplatz verbrauchen, falls Bilder wirklich schwer sind oder viele Seiten vorhanden sind. Ich habe gelesen, dass jemand den Vorschlag macht

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

In diesem Fall habe ich jedoch keinen direkten Stream des Bildes, sondern einen Wert, der in einer Liste enthalten ist. Hat jemand mit diesem Problem zu tun und wie wurde es gelöst?

Antworten:

1 für die Antwort № 1

Sie können einstellen completionBlock Bei jeder der Operationen, um zu tun, was immer Sie brauchen, ob das Speichern der responseData irgendwo oder was hast du.

Beachten Sie, dass es keine Garantie gibt, dass die Abschlussblöcke für alle Vorgänge bis zu dem Zeitpunkt abgeschlossen sind, zu dem der Stapel abgeschlossen ist. Hängen Sie also nicht davon ab, ob der Stapel im Stapelabschlussblock steht.


0 für die Antwort № 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.