在我的iOS应用程序中,我的UICollectionView可以显示大约1200个小图像(35x35点)。图像存储在应用程序包中。
我正确地重用了UICollectionViewCell,但仍然存在性能问题,这取决于我如何处理图像加载:
UIImage(named: "imageName")加载它们会导致内存崩溃-系统缓存的图像会填满内存。在某些情况下,应用程序需要分配更大的内存部分,但由于缓存的图像,这些内存不可用。操作系统没有触发内存警告和清除缓存,而是直接终止了应用程序。NSBundle.mainBundle().pathForResource("imageName", ofType: "png")加载它们。应用程序不再因为内存错误而崩溃,但加载单个图像的时间要长得多,即使在最新的iPhones上,快速滚动也会滞后。我可以完全控制图像,可以将它们转换为.jpeg或优化它们(我已经尝试了ImageOptim和其他一些选项,但都没有成功)。
如何一次解决这两个性能问题?
EDIT 1:
我还尝试在后台线程中加载图像。这是我的UICollectionViewCell子类中的代码
private func loadImageNamed(name: String) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { [weak self] () in
let image = bundle.pathForResource(name, ofType: "png")?.CGImage
if name == self?.displayedImageName {
dispatch_async(dispatch_get_main_queue(), {
if name == self?.displayedImageName {
self?.contentView.layer.contents = image
}
})
}
})
}这使得滚动平滑,而不消耗额外的内存缓存,但当滚动到某个位置编程时(例如,当UICollectionView滚动到顶部时)它会引起另一个问题:在滚动动画期间图像没有更新(滚动太快,无法加载),滚动完成后,错误的图像显示了几分之一秒-一个接一个地被正确的图像替换。这在视觉上是非常令人不安的。
EDIT 2:
我无法将小图像分组为较大的合成图像,并按照this answer的建议显示这些图像。
原因:
https://stackoverflow.com/questions/31785490
复制相似问题