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