从UICollectionView上的downloadURLs下载大量照片时,Firebase存储空间泄漏

时间:2016-08-01 21:49:41

标签: ios firebase firebase-storage

我在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。

2 个答案:

答案 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加载图像。