GCD で画像を読み込んでいますが、奇妙な動作が発生しました。
テーブル ビューをスクロールすると、すべてのアルバムがアートワークの取得を開始します。はNSTableCellView
すぐに多くの間違ったアートワークを表示し、おそらく 1 秒後に最終的に正しいアートワークを表示して停止します。
明らかにこれは、ディスパッチ後、の変数がNSTableCellView
同じインスタンスを指していないことを意味し、同じセルの画像が何度も何度も変更されます。
ディスパッチ ブロックを呼び出してこれを修正しようとしviewAtColumn:row:indexOfObject:
ましたが、問題は修正されません。
助言がありますか?
コード
- (ITAlbumTableCellView *)makeTableCellViewWithAlbum:(ITLibAlbum *)album {
ITAlbumTableCellView *cellView = (ITAlbumTableCellView *)[self makeTableCellViewWithIdentifier:kTCVIAlbum];
// ... Mapping Stuff
// Set artwork
if (![self._imageCache objectForKey:album]) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSImage *artwork = album.artwork;
if (!artwork || !artwork.isValid) artwork = [NSImage imageNamed:@"noArtwork"];
[self._imageCache setObject:artwork forKey:album];
dispatch_async(dispatch_get_main_queue(), ^{
NSTableCellView *tcv = [self.tableView viewAtColumn:0 row:[self.tableContent indexOfObject:album] makeIfNecessary:NO];
tcv.imageView.image = artwork;
});
});
} else {
cellView.imageView.image = [self._imageCache objectForKey:album];
}
return cellView;
}