0

ドキュメント ディレクトリの画像を表示するコレクション ビューを実装しました。

ただし、ドキュメントから画像が読み込まれるため、コレクション ビューがスムーズにスクロールされません。

イメージがメイン バンドルからロードされる場合、正常に動作します。

私のコードは次のとおりです。

UIImageView *img=[[UIImageView alloc]init];
img.image=[UIImage imageWithContentsOfFile:[[arr_images objectAtIndex:indexPath.row]valueForKey:@"Image_path"]];
img.contentMode=UIViewContentModeScaleAspectFit;
cell.backgroundView=img;

スレッドを使用する必要がありますか? はいの場合、どうすればそれを行うことができますか? どうすればこれを解決できますか??

4

2 に答える 2

6

スレッドを使用する必要はありません。画像を時々ロードするのは問題ありませんが、問題は常に画像をロードしていることです。

NSBundle が画像をキャッシュしているため、メイン バンドルからの読み込みはおそらく問題なく動作します。NSCacheを使用して同じことを自分で行うことができます。

したがって、これの代わりに:

img.image=[UIImage imageWithContentsOfFile:[[arr_images objectAtIndex:indexPath.row]valueForKey:@"Image_path"]];

次のようにします。

static NSCache *cache = nil;
if (!cache) {
    cache = [[NSCache alloc] init];
    [cache setCountLimit:10]; // check how much RAM your app is using and tweak this as necessary. Too high uses too much RAM, too low will hurt scrolling performance.
}

NSString *path = [[arr_images objectAtIndex:indexPath.row]valueForKey:@"Image_path"];
if ([cache objectForKey:path]) {
    img.image=[cache objectForKey:path];
} else {
    img.image=[UIImage imageWithContentsOfFile:path];
    [cache setObject:img.image forKey:path];
}

最終的にスレッドを使用する必要があることがわかった場合は、GCD スレッドを使用してイメージをロードしますが、そのイメージを、ここのサンプル コードで作成した同じ NSCache オブジェクトに挿入します。基本的に、バックグラウンド スレッドを使用してプリロードが必要なイメージを試行および予測しますが、NSCache がそれらのイメージを破棄する前に RAM に保持する期間を決定できるようにします。

于 2013-08-24T12:01:34.130 に答える
0

おそらく、バンドル内の画像はドキュメント フォルダー内の画像よりも小さいですが、それ以外の場合は違いはありません。

はい、スレッドを使用する必要があります。indexPathGCD を使用することは良いオプションです。主に注意すべきことは、セルを直接使用しないことです (画像が読み込まれるまでにセルが再利用されるかどうかはわかりません)。セルを取得し、そうでない場合nilは画像を更新します。

于 2013-08-24T12:01:40.660 に答える