2

現在、私はウェブサイトのクライアントに取り組んでいます。TableViewにロードする必要のある画像がたくさんあります。これが私が現在行っていることです:

NSDictionary *propertyItems = [self.items objectAtIndex:indexPath.row];
    cell.fio.font = [UIFont boldSystemFontOfSize:17.0f];

    if([propertyItems objectForKey:@"online"] == [NSNumber numberWithInt:1])
        cell.fio.textColor = [UIColor colorWithRed:0.3 green:0.6 blue:0.3 alpha:1.0];

    dispatch_queue_t downloadPhotosQueue = dispatch_queue_create("downloadPhotosQeue", NULL);
    dispatch_async(downloadPhotosQueue, ^{
        NSData *photosData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.example.com/%@", [propertyItems objectForKey:@"photo_trumb"]]]];
        dispatch_async(dispatch_get_main_queue(), ^{
            cell.pic.image = [UIImage imageWithData:photosData];
        });

    });

    cell.fio.text = [propertyItems objectForKey:@"fio"];

私はcellForRowAtIndexPath:メソッドでこれを行っています。すべてが高速に読み込まれています。しかし、問題は、テーブルを下にスクロールしているときに、もう一度上にスクロールすると、画像が何度もリロードされることです。

質問:サーバーから取得したUIImageを簡単にキャッシュする方法はありますか?したがって、一度ロードされた場合、アプリの実行中に何度もリロードされることはありません。多分私は何か間違ったことをしているのですか?

前もって感謝します!

4

4 に答える 4

1

AsyncImageViewを強くお勧めします。私はそれを使用し、それは魅力のように機能します。画像の URL を設定するだけで、すべてが処理されます。

AsyncImageView *imageView = [[AsyncImageView alloc]init];
imageView.imageURL = [NSURL URLWithString:@"https://www.google.es/logos/classicplus.png"];

画像をメモリにキャッシュするため、サーバーから再度取得することはありません。また、メモリの警告を受け取ったときにそれらを解放します。

于 2012-07-06T08:15:29.477 に答える
1

あなたが望むものを達成するために、このライブラリをお勧めします。

cellForRowAtIndexPath:

    [cell.imageView setImageWithURL:
    [NSURL URLWithString:[NSString stringWithString:@"www.yourimagepath.path"]]
      placeholderImage:[UIImage imageNamed:@"no_image.jpg"]];

ライブラリが画像をキャッシュします。画像の setHolder を設定することもできるため、画像のダウンロード中に空白の画像のように見えることはありません。

于 2012-07-06T08:31:31.430 に答える
1

ウェブサイトから画像をロードするには、AFNetworkingを使用します。URL から画像をロードするクラスを提供します。

#import "UIImageView+AFNetworking" をコントローラーまたはビュー実装ファイルの先頭に追加することから始めます。このカテゴリは、次のようなメソッドを UIImageView に追加します。

[imageView setImageWithURL:[NSURL URLWithString:@"…"]];

于 2012-07-06T08:12:43.383 に答える
0

問題はここにあります:

NSData *photosData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.example.com/%@", [propertyItems objectForKey:@"photo_trumb"]]]];

dataWithContentsOfURL

関数が呼び出されるたびに(スクロールするたびに)Urlへのリクエストを開始します。cellForRowAtIndexPath の前にすべての画像をロードする必要があります。ViewDidLoad のように。それらを配列に格納し、画像の配列を cellForRowAtIndexPath に表示するだけです。

あなたが言うようにロードするのが本当に速い場合: それらを mutableArray に格納します。画像が既に存在するかどうかを確認します。

于 2012-07-06T08:15:12.257 に答える