【问题标题】:Swift cache base64 string UIImage dataSwift缓存base64字符串UIImage数据
【发布时间】:2021-07-02 02:17:42
【问题描述】:

我正在尝试缓存图像来自服务的 UIImage(我正在使用 Alamofire)。服务向我发送一个 base64 字符串,我将 base64 转换为数据,然后在 tableviewcell 中打印

cell.imageview.image = UIImage(data: imageDatas[indexPath.row])

我搜索了很多库,如 Kingfisher 、 AlamofireImage ,但它们正在缓存 URL 图像,但无论如何都找不到使用 base64 字符串缓存图像。所以我找到了一个类似的例子并试试这个:

  private let cache = NSCache<NSNumber, UIImage>()
  private let utilityQueue = DispatchQueue.global(qos: .utility)

   private func loadImage(data : Data , completion: @escaping (UIImage?) -> ()) {
       utilityQueue.async {
           
        
           let image = imageDataDecodingClass.imageDataDecoding(imageData: data)
           
           DispatchQueue.main.async {
               completion(image)
           }
       }
   }

在单元格中:

       let itemNumber = indexPath.section * 2 + 1
       let imageData =  (showcaseDatas[indexPath.section * 2 + 1].Document?.Document!)!
       if let cachedImage = self.cache.object(forKey: NSNumber(value: itemNumber)) {
           cell.showcaseImage.image = cachedImage
      } else {
          cell.addSubview(progressHUDimage)
          self.loadImage(data: imageData, completion: {ret in
              cell.showcaseImage.image = ret
              self.cache.setObject(cell.showcaseImage.image!, forKey: NSNumber(value: itemNumber))
              progressHUDimage.removeFromSuperview()
          })
    }

它的缓存图像完美,但是当我滚动 tableview 时,CPU 增加了很多 (%70-90),这就是为什么 tableview 不平滑。

所以,我的问题是,如何在不增加 CPU 的情况下在 tableviewcell 中缓存 base64 字符串图像?谢谢

【问题讨论】:

  • 特别是我正在缓存数据,但问题仍然存在@Larme
  • 如果你不想自己做,试试 AlamofireImage

标签: ios swift uitableview caching


【解决方案1】:

如果您正在缓存 base64 StringData,将它们解码为图像总是会很成功。唯一的方法是缓存UIImage 本身,但这会根据图像的大小来权衡内存。
我只能给你一些建议:

  • 使用NSCache(好像已经在使用了)
  • 在另一个线程上调整您的图像大小以完全适合您在屏幕上呈现的大小,并仅在调整大小后缓存它们
  • 确保您看到的性能下降不是由于其他原因
  • 如果您使用的是单元格,则使用它们的索引路径缓存图像
  • 创建具有内存限制和元素数量限制的 NSCache

您还可以尝试创建 2 个缓存,一个用于准备解码图像,另一个作为 Data 对象的后备。
您的 Data 对象很小的事实并不意味着图像也是如此,它实际上取决于用于保存图像表示的压缩。 还有更先进的技术在物理内存上使用内存映射。

【讨论】:

  • 感谢您的建议
猜你喜欢
  • 2011-04-22
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
  • 2021-09-13
  • 2017-03-16
  • 2019-06-15
  • 2012-05-04
相关资源
最近更新 更多