我在github上的sample project之后将一些照片上传到Firebase存储。
在使用Firebase存储之前,我将照片保存到其他网站。当我从之前保存在其他网站上的图像URL下载照片时,没有任何问题,内存使用是合理的。但是,当我将图片的URL链接粘贴到Firebase数据库上的相应子项,然后从这些URL下载时,我似乎有一个可怕的内存问题。对于每个~200kb的图像,内存使用量大约增加10mb。由于我从其他URL下载图像时没有这个问题,我认为这是firebase特定的问题。有没有其他人遇到相同的内存问题?有什么建议/帮助吗?
注意:我将图片的网址保存到firebase实时数据库。我从那里下载URL链接并将它们提供给我的照片集视图单元格。这是我为照片集视图单元格编写的代码:
class PhotosCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var imageView: UIImageView!
private var downloadTask: FIRStorageDownloadTask!
var imageURL: String! {
didSet {
downloadTask = FIRStorage.storage().referenceForURL(imageURL).dataWithMaxSize(1*1024*1024) { (imageData, error) in
guard error == nil else { print(error); return }
if let imageData = imageData {
self.imageView.image = UIImage(data: imageData)
}
// imageView.kf_showIndicatorWhenLoading = true
// imageView.kf_setImageWithURL(NSURL(string: imageURL)!)
}
}
}
override func prepareForReuse() {
super.prepareForReuse()
imageView.image = nil
// imageView.kf_cancelDownloadTask()
downloadTask.cancel()
}
}
我唯一想要解决的是,我希望能够从我们保存在实时数据库中的URL下载保存到Firebase存储的图像。一个重要的事实是翠鸟从URL下载图像而没有任何内存问题。当这些图像URL来自firebase存储时,就会出现问题。
注意:从Firebase存储功能下载这些图像时,我也会遇到内存问题。我知道在某种程度上,内存使用率上升是正常的,但我在Firebase存储中的图像只有大约200KB。
答案 0 :(得分:0)
虽然您只下载了200kb的数据blob,但它的内存要比将其显示为图像要多得多。虽然"清晰度"图像的图像可以被压缩,它仍将保持相同的尺寸。图像通常需要每像素4个字节 - 红色,蓝色,绿色和alpha各一个。因此,2000x1000像素的图像需要大约8mb的内存,这与您所描述的内容非常接近。我首先会问你是否要缓存 images ,如果你正在缓存数据。除非您需要全尺寸,否则可能会帮助您更多的是调整您正在显示的图像的大小。使用类似的东西:
extension UIImage {
/// Returns a image that fills in newSize
func resizedImage(newSize: CGSize) -> UIImage {
// Guard newSize is different
guard self.size != newSize else { return self }
UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0);
self.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return newImage
}
}
并执行原始图像的一半尺寸,这将使其成本降低4倍。确保修改原始图像,而不是创建新图像。希望这会有所帮助。
答案 1 :(得分:0)
我遇到了同样的问题,而对我有帮助的一件事是SDWebImage。它可以从引用和直接url加载图像。