ios - 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 字符串图像?谢谢
解决方案
如果您正在缓存 base64 String
,或者Data
将它们解码为图像总会有问题。它是缓存自身的唯一方法UIImage
,但这会根据图像的大小来权衡内存。
我只能给你几个建议:
- 使用NSCache(看来你已经在使用了)
- 在另一个线程上调整图像的大小以完美匹配您在屏幕上呈现的大小,并仅在调整大小后缓存它们
- 确保您看到的性能下降不是由于其他原因
- 如果您使用的是单元格,则使用它们的索引路径缓存图像
- 创建你
NSCache
的内存限制和元素数量限制
您还可以尝试创建 2 个缓存,一个用于准备解码图像,另一个作为Data
对象的后备。
您的Data
对象很小的事实并不意味着图像也是如此,它实际上取决于用于保存图像表示的压缩。还有更先进的技术在物理内存上使用内存映射。
推荐阅读
- c - 无效的初始化程序:将值从结构分配给结构数组
- angular - 对本地 json 文件的 Http 请求不起作用
- python - 去除点和线等图像噪声
- javascript - 最初在 md-datepicker 上显示占位符
- android - 使用导航架构组件实现时如何在选项卡布局的选项卡中添加向左或向右滑动
- python - Spyder Editor:如何在 pandas 中读取 csv 文件?
- excel - 为数据透视表添加数据字段时出现错误的特殊字符?
- python - 列出索引 - Python,但它不应该是
- apache-spark - java.lang.ClassCastException:无法将 java.lang.invoke.SerializedLambda 的实例分配给字段 org.apache.spark.api.java.JavaPairRDD
- apache-spark - ElasticSearch bool 查询日期范围