テーブルを表示しています。各行には、URLから読み込まれた画像アイコンがあります。
画像を同期的にダウンロードするとUIがブロックされるため、グランドセントラルディスパッチを介して非同期で実装しました。
私の問題は、上下にスクロールすると、セルが再利用されているため、誤った画像が表示されることです。
これが発生している理由は推測できます。これは、再利用されたセルが画像を更新するため、以前のセルに新しくダウンロードされた間違った画像が含まれるようになるためです。これを解決するための理想的な方法は何でしょうか?
これが私のコードです。
ダウンロードした画像ごとに、「ImageStore」というシングルトンクラスに保存しています。
// set the data for each cell - reusing the cell
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
reuseIdentifier:@"UITableViewCell"];
}
// setting the image for each cell
// first check if there is UIImage in the ImageStore already
NSString *imageUrl = [obj objectForKey:@"image"];
if (imageUrl) {
if ([[ImageStore sharedStore] imageForKey:imageUrl]) {
[[[tableView cellForRowAtIndexPath:indexPath] imageView] setImage:[[ImageStore sharedStore] imageForKey:imageUrl]];
} else {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:
[NSURL URLWithString:[obj objectForKey:@"image"]]]];
dispatch_sync(dispatch_get_main_queue(), ^{
[[ImageStore sharedStore]setImage:image forKey:imageUrl];
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]withRowAnimation:UITableViewRowAnimationNone];
[[[tableView cellForRowAtIndexPath:indexPath] imageView] setImage:image];
});
});
}
}
return cell;
}