如何使用更少的内存在collectionView中显示照片库

时间:2018-10-20 20:02:06

标签: ios swift collectionview

我正面临一个问题,人们说应用程序在collectionView中加载照片库时崩溃。大多数时候,他们拥有2-3千多张照片。对我来说,一切正常。 (我的照片库中的照片不到1000张。)

问题:也许有什么方法可以显示收藏集中的图像查看更多“智能”并使用更少的内存吗?

P.S也许当用户的iCloud中所有照片也都可能导致崩溃时?因为到目前为止,我认为该应用程序在将其加载到单元格中时不会下载照片。也许有人可以证明或不同意这个事实。

这是我的职能:

func grabPhotos(){

    let imgManager = PHImageManager.default()

    let requestOptions = PHImageRequestOptions()
    requestOptions.isSynchronous = false
    requestOptions.deliveryMode = .opportunistic // Quality of images
    requestOptions.isNetworkAccessAllowed = true

    requestOptions.isSynchronous = true
    requestOptions.progressHandler = {  (progress, error, stop, info) in
        print("progress: \(progress)")
    }

    let fetchOptions = PHFetchOptions()
    fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

    if let fetchResult : PHFetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions) {

        if fetchResult.count > 0 {
            for i in 0..<fetchResult.count {
                imgManager.requestImage(for: fetchResult.object(at: i) , targetSize: CGSize(width: 150, height: 150), contentMode: .aspectFill, options: requestOptions, resultHandler: { image, error in
                    self.imageArray.append(image!)
                    self.kolekcija.reloadData()
                })
            }
        }
        else {
            print("You got no photos")
            kolekcija.reloadData()
        }
    }

}

1 个答案:

答案 0 :(得分:2)

问题是这一行:

self.imageArray.append(image!)

从不制作图像阵列。图像非常大,您将耗尽内存。

这是一个集合视图。您只需按需提供itemForRowAt:中的图像,然后提供的是图像的版本(即所谓的 thumbnail ),该图像应尽可能小用于显示尺寸。因此,在任何时候,只有足够的缩略图可以填充可见屏幕;这样不会占用太多内存,而且当图像从屏幕上滚动时,运行时还可以释放图像内存。

这就是PHCachingImageManager的用途。在示例代码中仔细查看Apple如何处理此问题:

https://developer.apple.com/library/archive/samplecode/UsingPhotosFramework/Listings/Shared_AssetGridViewController_swift.html

在该示例中,图像无处不在