我正在使用UICollectionView
制作相册。
我可以将图片加载到iPhone 7上。可以加载约2000张图片,但是如果向下滚动UICollectionView
时如果图片超过3000张,则该图片将非常缓慢,有时应用程序会停止运行。
我正在使用此代码来获取图片。
extension UIImageView {
func fetchImage(asset: PHAsset, contentMode: PHImageContentMode, targetSize: CGSize) {
let options = PHImageRequestOptions()
options.version = .original
options.isSynchronous = true
PHImageManager.default().requestImage(for: asset, targetSize: targetSize, contentMode: contentMode, options: options) { image, _ in
guard let image = image else { return }
switch contentMode {
case .aspectFill:
self.contentMode = .scaleAspectFill
case .aspectFit:
self.contentMode = .scaleAspectFit
}
self.image = image
}
}
}
我做了一个let imageCache = NSCache<NSIndexPath, UIImage>()
并在cellForItem
中使用了它。但这并没有解决这个问题。
还有其他方法吗?
我也连续得到3张图片,尺寸为self.view.frame.width / 2
如果没有办法。我必须缩小图像尺寸吗?
cellForItem
代码:
let imageCache = NSCache<NSIndexPath, UIImage>()
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "albumCell", for: indexPath) as? AlbumCollectionViewCell
let asset: PHAsset? = AlbumModel.allPhotos?.object(at: indexPath.row)
cell!.albumImageView.contentMode = .scaleAspectFill
if let fromImageCache = imageCache.object(forKey: indexPath as NSIndexPath) {
cell!.albumImageView.image = fromImageCache
return cell!
}
let setSize = CGSize(width: view.frame.width / 2, height: view.frame.width / 2)
cell!.albumImageView.fetchImage(asset: asset!, contentMode: .aspectFill, targetSize: setSize)
imageCache.setObject(cell!.albumImageView.image!, forKey: indexPath as NSIndexPath)
return cell!
}
答案 0 :(得分:0)
如果您一次加载3000张图片,将导致内存问题 应用将终止,为什么应用停止效果更好,您可以使用分页在CollectionView中加载3000张图片< / p>
答案 1 :(得分:0)
以下是一些在滚动照片库时提高性能的提示:
不要实现自己的图像缓存或使用默认的图像管理器,请使用自己的PHCachingImageManager
实例。您可以告诉它开始缓存滚动位置周围的图像以提高性能。
不要使用同步获取图像。使用异步方法并在完成块中更新图像视图,但是请注意,完成块可以在fetch方法返回之前触发,并在从库中获取质量更好的图像时触发多次。
当您的单元格离开屏幕时,取消获取。
我已经有一段时间没有使用该框架了,但是我写了一些关于它的笔记here,希望它们仍然有意义。