UIImageView を含むカスタム TableViewCells を持つ UITableView を持つ iOS アプリがあります。画像は Web サービスから読み込まれるため、最初の読み込み時に「読み込み中」の画像を表示し、gcd を使用してディスパッチし、そのセルのデータに一致する画像を取得します。
DISPATCH_QUEUE_PRIORITY_HIGH グローバル キューを使用してイメージ フェッチを実行すると、散発的に間違ったイメージがテーブルビュー セルに読み込まれます。独自のカスタム キューを使用すると、正しい画像がセルに取り込まれますが、テーブルビューのパフォーマンスはひどいものです。
これがコードです...
// See if the icon is in the cache
if([self.photoCache objectForKey:[sample valueForKey:@"api_id"]]){
[[cell sampleIcon]setImage:[self.photoCache objectForKey:[sample valueForKey:@"api_id"]]];
}
else {
NSLog(@"Cache miss");
[cell.sampleIcon setImage:nil];
dispatch_queue_t cacheMissQueue = dispatch_queue_create("cacheMissQueue", NULL);
//dispatch_queue_t cacheMissQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(cacheMissQueue, ^{
if(sample.thumbnailFilename && sample.api_id){
NSData *thumbNailData = [[NSData alloc] initWithContentsOfFile:sample.thumbnailFilename];
UIImage *thumbNailImage = [[UIImage alloc]initWithData:thumbNailData];
if(thumbNailImage){
// Set the cell
dispatch_sync(dispatch_get_main_queue(), ^{
[[cell sampleIcon]setImage:thumbNailImage];
[cell setNeedsLayout];
});
// save it to cache for future references
NSLog(@"DEBUG: Saving to cache %@ for sample %@",sample.thumbnailFilename,[sample objectID]);
[self.photoCache setObject:thumbNailImage forKey:sample.api_id];
}
}
});
dispatch_release(cacheMissQueue);
}