从 Firebase 下载的图像在大小仅为 200-400kb 时不知何故占用了 28mb 的内存
Images downloaded from Firebase are somehow taking up 28mb of memory a piece when they are only 200-400kb in size
我正在使用 Firebase 为我的应用托管和下载图像。 Firebase 上的每张图片大小在 200kb-400kb 之间,用户在滚动浏览 collectionView 时一次下载大约 12 张。当我启动下载图像的 VC 时,我的应用程序从使用大约 100mb 内存到 650mb 内存,总共下载 19 张图像。有问题的图像是 JPEG,在上传到 Firebase 之前已经压缩得很厉害。这些图像存储在一个 NSCache 中,清除缓存会使内存使用量回落到 100mb 左右。
这是怎么回事?以下是一些可能有帮助的代码?:
class TripOverviewCell:UICollectionViewCell {
@IBOutlet weak var imageView: UIImageView!
func updateUI(photo:Photo, image:UIImage? = nil) {
//Call when preparing to show image
if image != nil {
print("Loaded from cache")
imageView.image = image
photo.assignImage(image: image!)
} else {
let url = photo.imageUrl
let ref = FIRStorage.storage().reference(forURL: url)
ref.data(withMaxSize: 5*1024*1024, completion: { [weak self] (data, error) in
if error != nil {
print("Unable to download image")
} else {
print("Image downloaded")
if let imageData = data {
if let image = UIImage(data: imageData) {
self?.imageView.image = image
photo.assignImage(image: image)
TripsVC.imageCache.setObject(image, forKey: photo.uid as NSString)
}
}
}
})
}
}
}
正如 Frank 评论的那样,显示的图像比图像数据占用更多 space。我的错误在于我正在缓存 UIImages,这是完整显示的图像。相反,我应该缓存数据,然后在我需要的地方根据该数据创建图像。内存使用量从 550mb 下降到大约 20mb。
我正在使用 Firebase 为我的应用托管和下载图像。 Firebase 上的每张图片大小在 200kb-400kb 之间,用户在滚动浏览 collectionView 时一次下载大约 12 张。当我启动下载图像的 VC 时,我的应用程序从使用大约 100mb 内存到 650mb 内存,总共下载 19 张图像。有问题的图像是 JPEG,在上传到 Firebase 之前已经压缩得很厉害。这些图像存储在一个 NSCache 中,清除缓存会使内存使用量回落到 100mb 左右。
这是怎么回事?以下是一些可能有帮助的代码?:
class TripOverviewCell:UICollectionViewCell {
@IBOutlet weak var imageView: UIImageView!
func updateUI(photo:Photo, image:UIImage? = nil) {
//Call when preparing to show image
if image != nil {
print("Loaded from cache")
imageView.image = image
photo.assignImage(image: image!)
} else {
let url = photo.imageUrl
let ref = FIRStorage.storage().reference(forURL: url)
ref.data(withMaxSize: 5*1024*1024, completion: { [weak self] (data, error) in
if error != nil {
print("Unable to download image")
} else {
print("Image downloaded")
if let imageData = data {
if let image = UIImage(data: imageData) {
self?.imageView.image = image
photo.assignImage(image: image)
TripsVC.imageCache.setObject(image, forKey: photo.uid as NSString)
}
}
}
})
}
}
}
正如 Frank 评论的那样,显示的图像比图像数据占用更多 space。我的错误在于我正在缓存 UIImages,这是完整显示的图像。相反,我应该缓存数据,然后在我需要的地方根据该数据创建图像。内存使用量从 550mb 下降到大约 20mb。