为什么nil检查表视图单元格属性会导致我的一个单元格复制另一个单元格



我的表视图通过每个tableView:cellForIndexPath:中的SDWebImage(UIImageView的异步图像下载/缓存类别)加载图片。

                                               // 'spot' is a dictionary of this cell's attributes
NSURL* imageURL = [NSURL URLWithString:(NSString*)[spot objectForKey:@"Image"]];
UIImage* placeholderImage = [UIImage imageNamed:@"placeholder.png"];

^加载图像,但必须不断发出请求或从缓存中提取。所以我想看看渲染的细胞是否存储在内存中,所以我只能在需要的时候请求图像。我通过添加对图像视图的图像属性的简单检查来实现这一点。

if (!cell.pictureView.image)
{
    NSURL* imageURL = [NSURL URLWithString:(NSString*)[spot objectForKey:@"Image"]];
    UIImage* placeholderImage = [UIImage imageNamed:@"placeholder.png"];
    [cell.pictureView setImageWithURL:imageURL placeholderImage:placeholderImage options:SDWebImageCacheMemoryOnly];
}

这很有效,并使我的图像在退出和重新进入应用程序后不必重新加载。但是,在我的一个单元格中,有一个故意坏的图像url(用于调试),这个图像——以前保留为imageNamed:@"placeholder"——现在与我的第二个单元格的图像相同。

我很好奇是什么样的细胞重用/缓存魔法导致细胞拍摄前一个细胞的照片。

保留单元属性并仅在需要时进行设置的最佳方式是什么?

问题很可能与您使用的图像包有关。如果您重复请求URL来获取图像,那么最好实现NSURLCache,这是一个相当简单的方法,可以完美地处理缓存,所以这不是一个问题。这是NSHipster关于如何使用它的指南。其他解决方案倾向于解决这类问题。由于它是UIImageView上的一个类别,因此在单元格中使用时,它可能是导致UIImageView实现问题的任何因素。

相关内容

最新更新