スレッドを使用する必要はありません。画像を時々ロードするのは問題ありませんが、問題は常に画像をロードしていることです。
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 に保持する期間を決定できるようにします。