首页 > 解决方案 > Swift缓存base64字符串UIImage数据

问题描述

我正在尝试缓存图像来自服务的 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 字符串图像?谢谢

标签: iosswiftuitableviewcaching

解决方案


如果您正在缓存 base64 String,或者Data将它们解码为图像总会有问题。它是缓存自身的唯一方法UIImage,但这会根据图像的大小来权衡内存。
我只能给你几个建议:

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

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


推荐阅读