迅捷4,如何在collectionView中加载超过3000幅图片?

时间:2018-12-19 09:58:23

标签: swift collectionview

我正在使用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!
}

2 个答案:

答案 0 :(得分:0)

如果您一次加载3000张图片,将导致内存问题 应用将终止,为什么应用停止效果更好,您可以使用分页在CollectionView中加载3000张图片< / p>

答案 1 :(得分:0)

以下是一些在滚动照片库时提高性能的提示:

不要实现自己的图像缓存或使用默认的图像管理器,请使用自己的PHCachingImageManager实例。您可以告诉它开始缓存滚动位置周围的图像以提高性能。

不要使用同步获取图像。使用异步方法并在完成块中更新图像视图,但是请注意,完成块可以在fetch方法返回之前触发,并在从库中获取质量更好的图像时触发多次。

当您的单元格离开屏幕时,取消获取。

我已经有一段时间没有使用该框架了,但是我写了一些关于它的笔记here,希望它们仍然有意义。