在我的应用中,我建立了自己的异步图像加载类。我传入一个对象,然后它会检查缓存(NSCache)是否有该图像,如果没有,则会检查文件系统是否已经保存了该图像。如果该图像还没有被保存,那么它将在后台下载图像(使用NSOperations)。目前为止,这个方法运行得很好,但是我在表视图加载图像时遇到了一些小问题。
首先,这是我使用的函数来设置表视图单元格,来自于
首先,这是我使用的函数来设置表视图单元格,来自于
tableView(tableView:, willDisplayCell:, forRowAtIndexPath:)
。func configureCell(cell: ShowTableViewCell, indexPath: NSIndexPath) {
// Configure cell
if let show = dataSource.showFromIndexPath(indexPath) {
ImageManager.sharedManager.getImageForShow(show, completionHandler: { (image) -> Void in
if self.indexPathsForFadedInImages.indexOf(indexPath) == nil {
self.indexPathsForFadedInImages.append(indexPath)
if let fetchCell = self.tableView.cellForRowAtIndexPath(indexPath) as? ShowTableViewCell {
func fadeInImage() {
// Fade in image
fetchCell.backgroundImageView!.alpha = 0.0
fetchCell.backgroundImage = image
UIView.animateWithDuration(showImageAnimationSpeed, animations: { () -> Void in
fetchCell.backgroundImageView!.alpha = 1.0
})
}
if #available(iOS 9, *) {
if NSProcessInfo.processInfo().lowPowerModeEnabled {
fetchCell.backgroundImage = image
}
else {
fadeInImage()
}
}
else {
fadeInImage()
}
}
else {
// Issues are here
}
}
else {
// Set image
cell.backgroundImage = image
}
})
...
}
在“// Issues are here”注释的位置,我遇到了多个问题。
到目前为止,我还没有找到另一种方法来验证图片确实属于“// Issues are here”所在的单元格。如果我在那里添加
cell.backgroundImage = image
那么它就可以解决有时图像不会显示在表格视图单元格上的问题。到目前为止,我发现唯一的原因是图像返回得比我返回表格视图单元格的速度更快,这就是为什么表格视图说在该索引路径处没有单元格的原因。
但是,如果我在那里添加那段代码,那么我就会遇到另一个问题!单元格将显示错误的图像,然后拖慢应用程序,图像将不断切换,甚至只停留在错误的图像上。
我已经检查过它在主线程上运行,图像下载和缓存都很好。它只是要做的是表格正在说在该索引路径处没有单元格,我尝试获取单元格的indexPath也返回nil。
这个问题的半个解决方案是在viewWillAppear/viewDidAppear中调用tableView.reloadData()。这将解决问题,但我失去了屏幕上表格视图单元格的动画效果。
编辑:
如果我将imageView传递到getImageForShow()并直接设置它,它将解决这个问题,但这是不太理想的代码设计。显然,imageView存在,单元格也存在,但由于某种原因,它并不总是起作用。