gpt4 book ai didi

objective-c - 在 NSTableView 中加载图像时的奇怪行为

转载 作者:行者123 更新时间:2023-12-03 17:53:19 25 4
gpt4 key购买 nike

我正在使用 GCD 加载图像,但出现了一些奇怪的行为。

当您滚动表格 View 时,每个专辑都会开始获取艺术品。NSTableCellView 快速显示许多错误的艺术品,直到大约一秒钟后它最终显示正确的艺术品然后停止。

显然这意味着,在分派(dispatch)之后,NSTableCellView 的变量不再指向同一个实例,这会导致同一单元格的图像一遍又一遍地更改。

我尝试通过在调度 block 中调用 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;
}

最佳答案

您使用可重用的单元格,因此当单元格隐藏在边界之外时,它可以重用以显示其他数据。快速修复:

 - (ITAlbumTableCellView *)makeTableCellViewWithAlbum:(ITLibAlbum *)album {
ITAlbumTableCellView *cellView = (ITAlbumTableCellView *)[self makeTableCellViewWithIdentifier:kTCVIAlbum];
static int tag = 0;
tag++;
int tagForBlock = tag;
cellView.tag = tag;
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(), ^{
if(tagForBlock != cellView.tag)
return;
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;
}

关于objective-c - 在 NSTableView 中加载图像时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18697613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com