2

画像で構成される 4 つの URL があります...これらの画像をダウンロードして、ドキュメント フォルダーに配置しています。

ここに私のコードがあります..

-(void)viewDidLoad
{
NSMutableArray *myUrlsArray=[[NSMutableArray alloc]init];
[myUrlsArray addObject:@"http://blogs.sfweekly.com/thesnitch/steve_jobs3.jpg"];
[myUrlsArray addObject:@"http://www.droid-life.com/wp-content/uploads/2012/12/Steve-Jobs-Apple.jpg"];
[myUrlsArray addObject:@"http://2.bp.blogspot.com/-T6nbl0rQoME/To0X5FccuCI/AAAAAAAAEZQ/ipUU7JfEzTs/s1600/steve-jobs-in-time-magazine-front-cover.png"];
[myUrlsArray addObject:@"http://images.businessweek.com/ss/08/09/0929_most_influential/image/steve_jobs.jpg"];
[myUrlsArray addObject:@"http://cdn.ndtv.com/tech/gadget/image/steve-jobs-face.jpg"];

for (int i=0; i<myUrlsArray.count; i++)
{
    [self downloadImageFromURL:[myUrlsArray objectAtIndex:i] withName:[NSString stringWithFormat:@"MyImage%i.jpeg",i]];
}

}




#pragma mark- downloading File

-(void)downloadImageFromURL:(NSString *)myURLString withName:(NSString *)fileName
{
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:myURLString]]];

NSLog(@"%f,%f",image.size.width,image.size.height);

   // Let's save the file into Document folder.**

    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) objectAtIndex:0];

NSString *jpegPath = [NSString stringWithFormat:@"%@/%@",documentsPath,fileName];// this path if you want save reference path in sqlite
NSData *data2 = [NSData dataWithData:UIImageJPEGRepresentation(image, 1.0f)];//1.0f = 100% quality
[data2 writeToFile:jpegPath atomically:YES];

}

今...上記のダウンロードの進行状況を正確に表示するためにUIProgressViewを表示する必要があります。

どうすればこの機能を実現できますか...

これを達成するためのガイドラインを提供できますか..

前もって感謝します...

4

4 に答える 4

2

(a)メインキューをブロックしないようにするのNSURLSessionではなく、非同期ダウンロード手法(AFNetworking、SDWebImage、またはデリゲートベースで独自にロールする)を使用することをお勧めします。dataWithContentsOfURL(b) ダウンロードの進行に合わせて進行状況の更新を取得できます。

NSProgressダウンロードごとに作成することもお勧めします。デリゲート メソッドがダウンロードされたバイト数に関する更新を取得したら、オブジェクトを更新しNSProgressます。

NSProgress次に、それぞれをobservedProgressfor に関連付けることができます。UIProgressViewまた、 を更新するNSProgressと、UI が自動的に更新されます。

UIProgressViewまたは、ダウンロードごとにすべての合計進行状況を表示する単一の場合NSProgress、親を作成し、各ダウンロードを親の子としてNSProgress確立し、各ダウンロードがそれぞれのを更新すると、これが自動的にトリガーされます親の計算。繰り返しになりますが、その親を masterに関連付けることができ、ダウンロードごとに個々の を更新するだけで、全体の進行状況で UI を自動的に更新できます。NSProgressNSProgressNSProgressNSProgressNSProgressUIProgressViewNSProgress


ただし、一部の Web サービスでは予想されるバイト数が通知されないという点で、1 つのトリックがあります。彼らは、「予想されるバイト数」NSURLResponseUnknownLength、つまり -1!を報告します。(おそらくこの質問の範囲を超えている論理的な理由があります。)これにより、ダウンロードされた割合を計算することが明らかに難しくなります。

その場合、いくつかのアプローチがあります。

  1. 手を投げて、不確定な進行状況インジケーターを使用するだけです。

  2. Web サービスが意味のある「予想されるバイト数」の値を報告するように、リクエストを変更してみてください (例: https://stackoverflow.com/a/22352294/1271826 )。また

  3. 「推定ダウンロード サイズ」を使用して、完了率を推定できます。たとえば、画像が平均してそれぞれ 100kb であることがわかっている場合、次のようなことを実行しNSProgressて、特定のダウンロードに関連付けられたを更新できます。

    if (totalBytesExpectedToWrite >= totalBytesWritten) {
        self.progress.totalUnitCount = totalBytesExpectedToWrite;
    } else {
        if (totalBytesWritten <= 0) {
            self.progress.totalUnitCount = kDefaultImageSize;
        } else {
            double written = (double)totalBytesWritten;
            double percent = tanh(written / (double)kDefaultImageSize);
            self.progress.totalUnitCount = written / percent;
        }
    }
    
    self.progress.completedUnitCount = totalBytesWritten;
    

    これは、推定の基礎としてを使用して、tanh関数を使用してスムーズかつ漸近的に 100% に近づく「完了率」値を返すちょっとした手品です。kDefaultImageSize

    完璧ではありませんが、完了率のかなり適切なプロキシが得られます。

于 2013-03-15T15:23:47.047 に答える
2

を使用しないdataWithContentsOfURLでください。データが到着するまでメインスレッドをブロックしています。

代わりに、デリゲートとの独自の接続を作成NSURLConnectionし、デリゲートのリッスンを開始します。

  • connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response: で合計データ サイズを取得し[response expectedContentLength]ます。
  • connection:(NSURLConnection *)connection didReceiveData:(NSData *)data: ここで計算を行い、 を更新しますUIProgressView。loadedBytes/合計データ サイズのようなものです。

幸運を。

于 2013-03-15T14:07:43.843 に答える
2

dataWithContentsOfURL への呼び出しは同期的です。つまり、ダウンロードが進行中であるため、更新は取得されません。

ダウンロードの進行状況へのコールバックを持つAFNetworking ( https://github.com/AFNetworking/AFNetworking ) のようなライブラリを使用できます。

于 2013-03-15T13:49:13.883 に答える
2

実際には、より良い解決策は、バックグラウンドで画像をロードしてキャッシュする SDWebImage マネージャーを使用することです。次にその画像を使用するときに、キャッシュがチェックされます。ググってください。

そうすれば、ユーザーはダウンロード中に座って待つ必要もありません..

次に、ステータスを行う方法についていくつかのアイデアがあるこの他の質問を見てください。

SDWebImage でアクティビティ インジケーターを表示する方法

于 2013-03-15T14:02:10.190 に答える