在我的应用程序中,我构建了自己的异步图像加载类。我传入一个对象,然后它检查缓存(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”注释所在的位置,这就是我遇到多个问题的地方。
到目前为止,我还没有找到另一种方法来验证图像是否属于单元格,以确定“//问题在这里”在哪里。如果我添加
cell.backgroundImage = 图像
在那里,它修复了有时图像不会显示在表格视图单元格上的问题。到目前为止,我发现的唯一原因是图像的返回速度比我返回表视图单元格的速度快,这就是为什么表视图说该索引路径处没有单元格的原因。
但如果我在那里添加该代码,那么我会遇到另一个问题!单元格将显示错误的图像,然后它会滞后于应用程序,并且图像会不断切换,甚至只是停留在错误的图像上。
我检查过它在主线程上运行,图像下载和缓存一切正常。它只需要表说该索引路径上没有单元格,并且我尝试获取也返回 nil 的单元格的索引路径。
这个问题的半解决方案是在 viewWillAppear/viewDidAppear 中调用 tableView.reloadData() 。这将解决问题,但随后我会丢失屏幕上表格视图单元格的动画。
EDIT:
如果我将图像视图传递给 getImageForShow() 并直接设置它,它将解决这个问题,但这不是理想的代码设计。图像视图显然存在,单元格存在,但由于某种原因它不想每次都工作。