作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用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!
}
最佳答案
以下是一些提高滚动浏览照片库时性能的提示:
不要实现您自己的图像缓存或使用默认图像管理器,请使用您自己的 PHCachingImageManager
实例。您可以告诉它开始缓存滚动位置周围的图像以提高性能。
不要使用同步获取图像。使用异步方法并更新完成 block 中的 ImageView ,但请注意,完成 block 甚至可以在 fetch 方法返回之前触发,并且当您从库中获取质量更好的图像时多次触发。
当单元格离开屏幕时取消提取。
我已经有一段时间没有使用该框架了,但我写了一些关于它的笔记 here希望这些仍然具有相关性。
关于swift 4,如何在collectionView中加载超过3000~张图片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53848706/
我是一名优秀的程序员,十分优秀!