0

Web サイトから iPhone アプリへの画像の保存に関するフォーラムの投稿を見つけましたが、速度以外はすべて問題ないので使用しています。

画像は約 10KB で、画像が 1 つの場合はまあまあの速度でダウンロードされますが、15 ~ 20 の画像がある場合は非常に遅くなります。

iPhoneにいくつかのニュースアプリがあり、このアプリが私のような画像を含む15〜20の記事をダウンロードするため、別の方法で画像をより速くダウンロードする方法があるに違いないことを知っています(品質が同じかそれ以上であるため、私のように言います)。 5 秒 (またはそれ以上) 速くなります。

私の質問は次のとおりです。Web サイトから iPhone アプリに画像をダウンロードする別の高速な方法はありますか?

これは私のコードです:

#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) //1

#import "downloadImage.h"

@interface downloadImage ()

@end

@implementation downloadImage

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}



- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *imgUrl = @"http://somesite.com/someimage.jpg";

    dispatch_async(kBgQueue, ^{

        [self performSelectorOnMainThread:@selector(downloadImageFromWeb:) withObject:imgUrl waitUntilDone:YES];

    });

}

-(void)downloadImageFromWeb:(NSString *)imgUrl{


    UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:imgUrl]]];

    NSArray *parts = [imgUrl componentsSeparatedByString:@"/"];

    NSString *imgFilename = [parts lastObject];

    [self saveImage:image:imgFilename];

}


- (void)saveImage:(UIImage*)image:(NSString*)imageName {

    NSData *imageData = UIImageJPEGRepresentation(image, 100);
    NSFileManager *fileManager = [NSFileManager defaultManager];

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

    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:
                          imageName];

    [fileManager createFileAtPath:fullPath contents:imageData attributes:nil];

    //NSLog(@"image saved");

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
4

4 に答える 4

1

1)通常のブラウザからこの画像の実際の読み込み時間を確認してください。これはサーバー側の問題である可能性があります

2)これには、AsyncImageViewなどの実績のあるコードを使用してみて、あなたのものとの違いがあるかどうかを確認してください。

3) 保存を削除し、再度テストします。速くなる場合は、保存をサブスレッド化します (ただし、あまり多くのスレッドを作成することはお勧めできません)。

4) メインスレッドでロードセレクターを実行するのはなぜですか? バックグラウンド スレッドで実行し、後でメイン スレッドの画像を更新します。現在ディスパッチしている方法では、メインスレッドがブロックされます。

于 2012-10-30T11:56:34.187 に答える
1

speed画像のダウンロードは とに依存しinternetますserver

UIダウンロード中に手間をかけたくない場合は、次の場所applicationでダウンロードを実行しますBackground process

    [self performSelectorInBackground:@selector(downloadImageFromWeb:) withObject:imgUrl waitUntilDone:NO];
于 2012-10-30T11:57:50.613 に答える
0
dataWithContentsOfURL 

同期呼び出しです。私たちNSConnectionと inconnectionDidFinishedLoadingは main que を取得し、必要な場所に画像を設定します。これはバックグラウンドで実行されます

于 2012-10-30T11:57:50.347 に答える
0

を使用することdispatch_asyncをお勧めします。しかし、あなたの場合、この行は問題を引き起こします:

dispatch_async(kBgQueue, ^{

        [self performSelectorOnMainThread:@selector(downloadImageFromWeb:) withObject:imgUrl waitUntilDone:YES];

    });

次のようにコードを変更します。

dispatch_async(kBgQueue, ^{

            [self downloadImageFromWeb:imgUrl];

        });

次のドキュメントを参照してください。

パフォーマンス:dispatch_async

同時実行プログラミングガイド

これは、そのような状況に対処するための優れたチュートリアルです。

于 2012-10-30T13:42:41.717 に答える