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

时间:2018-07-18 10:47:40

标签: ios swift uicollectionview grand-central-dispatch file-manager

我正在使用UICollectionViewController创建自定义照片库。使用AVFoundation(自定义相机)将图像保存到文件管理器。它运行良好,并将图像保存到文件管理器。

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

我也在使用预取。

我希望在UICollectionView中显示最大20 KB到30 KB(足以显示)的压缩图像。

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

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

  

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

还使用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)
            }
        })
    }
}

文件管理器扩展名

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")
    }
}

0 个答案:

没有答案