0

ASIHTTPは非推奨になっているように見えますが、私が取り組んでいる新しいプロジェクトでは、AFNetworkingを学習しようとしていますが、解決できないいくつかの問題に直面しています。ローカルに保存するには、自分のWebサイトから多くの画像をダウンロードする必要があります。残念ながら、この画像はサーバーによってサーバースタンドアロンではありませんが、画像データとともにいくつかのパラメーターを返すplistに組み込まれています

画像を提供するphpコードはこれです

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

サーバーのこのページへのリクエストを管理するために私はこのコードを使用しました

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

                                  }];

しかし、進行中のブロック中に画像を保存することはできません(ブロックに他のパラメータがないため)。画像が非常に重い場合やたくさんある場合は、操作配列を反復処理するとメモリが少し消費される可能性がありますページの。私は誰かが使用することを提案していることを読みました

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

しかし、この場合、私は画像の直接ストリームを持っていませんが、plistに含まれている値を持っています。誰かがこの問題に直面し、どのようにそれを解決しましたか?

4

2 に答える 2

1

それぞれの操作を設定して、どこかcompletionBlockを節約するか、何をするかなど、必要なことをすべて実行できます。responseData

バッチが完了するまでにすべての操作の完了ブロックが終了するという保証はないため、バッチ完了ブロックの完了ブロックに依存しないように注意してください。

于 2012-11-09T18:52:59.520 に答える
0
// 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. 
于 2012-11-07T15:05:35.093 に答える