Ios 如何在Swift中从文件管理器获取压缩图像?

Ios 如何在Swift中从文件管理器获取压缩图像?,ios,swift,uicollectionview,grand-central-dispatch,file-manager,Ios,Swift,Uicollectionview,Grand Central Dispatch,File Manager,我正在使用UICollectionViewController创建自定义照片库。使用AVFoundation(自定义相机)将图像保存到文件管理器。它工作正常&将图像保存到文件管理器 现在,我想将所有捕获的图像加载到UICollectionView。图像大小非常大,因此UICollectionView变得非常缓慢 我也在使用预取。 我想压缩图像高达20 KB至30 KB(足以显示)显示在UICollectionView 我的问题是,如何从文件管理器(~5到10MB,有时是15MB)获取压缩图像(~

我正在使用UICollectionViewController创建自定义照片库。使用AVFoundation(自定义相机)将图像保存到文件管理器。它工作正常&将图像保存到文件管理器

现在,我想将所有捕获的图像加载到UICollectionView。图像大小非常大,因此UICollectionView变得非常缓慢

我也在使用预取。

我想压缩图像高达20 KB至30 KB(足以显示)显示在UICollectionView

我的问题是,如何从文件管理器(~5到10MB,有时是15MB)获取压缩图像(~30KB)?

需要保存两种类型的图像(原始图像和压缩图像)?

但我不想保存两种类型的图像,因为它占用内存

还使用了NSCache扩展,但CollectionView仍然非常慢

let imageCache = NSCache<NSString, UIImage>()

class CustomImageView: UIImageView {

    var id: String?

    //imageID coming from CoreData
    func loadImage(imageID: String) {

        id = imageID
        image = nil

        if let imageFromCache = imageCache.object(forKey: imageID as NSString) {
            self.image = imageFromCache
            print("already loaded \(imageID)")
            return
        }

        DispatchQueue.main.async(execute: {
            //FileManager Extension
            let url = FileManager.itemUrl(itemID: "\(imageID)").path
            if let img = UIImage(contentsOfFile: url) {
                if self.id == imageID {
                    self.image = img
                }
                imageCache.setObject(img, forKey: imageID as NSString)
            }
        })
    }
}

在保存过程中执行此操作,保存一张H-Res图像,压缩并保存一张“低分辨率”图像,然后在需要时仅加载低分辨率图像和H-Res。首先,由于内存问题,我不想同时保存这两张图像。第二,这是解决问题的唯一办法吗?Apple Photos应用程序是如何工作的?当你调整图像大小时,你的集合视图单元格大小应该是动态的,这会影响性能。Apple Photos应用程序可能使用照片框架或其私有版本。照片框架可用于生成和缓存图像的缩略图。因此,苹果只存储一张原始图像,并在生成缩略图时进行压缩?
public extension FileManager {

    static var documentDirectoryURL: URL {
        return try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
    }

    static func itemUrl(itemID: String) -> URL {
        return documentDirectoryURL.appendingPathComponent("\(itemID).png")
    }
}