【问题标题】:Firebase Storage memory leak when downloading a number of photos from downloadURLs on UICollectionView从 UICollectionView 上的 downloadURLs 下载大量照片时,Firebase 存储内存泄漏
【发布时间】:2016-12-07 02:45:17
【问题描述】:

我按照 github 上的 sample project 将一些照片上传到 Firebase Storage。

在使用 Firebase 存储之前,我将照片保存到其他网站。当我从之前在其他网站上保存的那些图像 URL 下载照片时,没有任何问题并且内存使用是合理的。但是,当我将图像的 URL 链接粘贴到 Firebase 数据库上的相应子项,然后从这些 URL 下载时,我似乎遇到了严重的内存问题。对于每 ~200kb 图像,内存使用量增加 ~10mb。由于我从其他 URL 下载图像没有这个问题,我相信这是一个特定于 firebase 的问题。有没有人遇到同样的内存问题?有什么建议/帮助吗?

注意:我将图像的 URL 保存到了 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 存储的图像。一个重要的事实是,kingfisher 从 URL 下载图像时没有任何内存问题。当这些图像 URL 来自 firebase 存储时,就会出现问题。

注意:从 Firebase 存储功能下载这些图像时,我也会遇到内存问题。我在某种程度上知道内存使用量增加是正常的,但我在 Firebase 存储中的图像只有大约 200KB。

【问题讨论】:

  • 您能否发布一些有关如何下载这些 URL 的代码?您只是在使用示例项目并注意到它吗?
  • 感谢您回答弗兰克。不,我不想将照片存储在本地磁盘上,所以我使用(并且一直在使用没有任何内存问题)流行的第三方 library 来下载图像。
  • 可能是因为iOS在解压jpeg图片方面不如png格式好?是否可以将 png 格式的图像保存到 Firebase 存储?我尝试更改元数据,例如 `metadata.contentType = "image/png"`,但是当我使用此元数据上传后下载时,我看到图像格式仍然是 JPEG。
  • 如果您没有使用 Firebase Storage 的内置下载功能,您只是将下载 URL 传递给某个第三方库,听起来这不是 Firebase Storage 的问题--听起来第三方库下载有问题。
  • 另外,在不改变文件实际编码的情况下改变内容类型没有任何作用——你需要使用UIImageJPEGRepresentationUIImagePNGRepresentation

标签: ios firebase firebase-storage


【解决方案1】:

虽然您只下载 200kb 的数据块,但将其显示为图像会花费更多的内存。虽然图像的“清晰度”可能会被压缩,但它仍将保持相同的尺寸。图像通常每个像素需要 4 个字节 - 红色、蓝色、绿色和 alpha 各一个。因此,2000x1000 像素的图像需要约 8mb 的内存,这与您所描述的很接近。我首先会问你是否正在缓存 图像,如果是,则改为缓存 data。除非您需要全尺寸,否则可能对您更有帮助的是调整您正在显示的图像的大小。使用类似的东西:

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 倍。确保修改原始图像而不是创建新图像。希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,而对我有帮助的一件事是 SDWebImage。它可以从 refs 和直接 url 加载图像。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多