我有一个收集视图,其中充满了来自服务器的大量数据:
单元格的结构:
基本上,我的集合布局就像-一行(多行)中的3个单元带有圆角和阴影。 我面临的问题是,当我从服务器收到30多种产品时,我的内存使用量最多增加了200 MB,而在较旧的设备(iOS 10. *)上,我的屏幕显示了滞后的视图。
我接收数据的方式是:
Interactor
中,我请求产品的所有文本数据以及图像文件的链接,在我的收藏夹视图cellForItemAt
中显示此数据,然后开始使用该库-Kingfisher
if url != nil {
productsCell.productImage.kf.indicatorType = .activity
productsCell.productImage.kf.setImage(with: url)
} else {
productsCell.productImage.image = clipImage
}
我收到的图像大小在4-6 Mb之间。
我将VIPER用作我的应用程序的体系结构,并检查了内存泄漏,但一切似乎都很好。当我在其他屏幕上启动应用程序时,我的内存使用量约为30 MB。因此,我面临的主要问题是加载图像数据。 我已经用Google搜索了配额,并阅读了许多有关优化的文章,但是它们大多提供了一般性建议,并且没有像我在这里反映的那样。 他们提供的是:
在测试过程中,我发现,如果我用静态剪辑图像填充集合视图,则内存使用量将下降至±100 MB
我想问:
提前感谢您的帮助,祝您周末愉快!
答案 0 :(得分:1)
我认为您需要实现UITableViewDelegate函数tableView:didEndDisplayingCell:forRowAtIndexPath
func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
cell.imageView.kf.cancelDownloadTask()
}
Kingfisher允许配置图像缓存参数(ImageCache),例如:
maxCachePeriodInSecond,maxMemoryCost,maxDiskCacheSize
因此,您可以配置maxMemoryCost,以使内存不超过50mb。
Kingfisher还会在收到内存警告通知时自动清除内存缓存。
答案 1 :(得分:0)
您的问题很可能是图像的尺寸很大,请尝试将其压缩为JPEG格式。您可以尝试压缩质量来找到一个最佳位置。
guard let imageRep = UIImageJPEGRepresentation(image, 0.3) else { return }