【问题标题】:CollectionView with lots of data Swift具有大量数据 Swift 的 CollectionView
【发布时间】:2019-03-11 02:41:51
【问题描述】:

我有一个集合视图,里面充满了来自服务器的大量数据:

细胞结构:

  • 一张图片
  • 每个单元格中有 2 行文本

基本上,我的集合布局类似于 - 一行(多行)中的 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

我想问一下:

  • 是否有任何现成的集合视图解决方案已经优化以处理大量图像数据?我搜过github,但是大部分collectionviews框架都和Cutom Layouts有关。
  • 如何在处理大量数据时减少内存使用量?
  • 图像大小会导致这样的内存负载吗?
  • 我可以避免使用分页,因为集合视图会重复使用单元格吗?

提前感谢您的帮助,祝您周末愉快!

【问题讨论】:

    标签: ios swift memory-management memory-leaks uicollectionview


    【解决方案1】:
    • Kingfisher 已包含您需要的所有功能
    • 您可以使用多个级别的缓存,例如如果您达到内存使用限制,那么它将在磁盘上缓存数据
    • 是的,如果您在内存中保存大量图像
    • 如果单元格在屏幕上结束显示,您可以禁用下载图像。

    我认为你需要实现 UITableViewDelegate func 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 也会自动清除内存缓存。

    【讨论】:

    • 您好,感谢您的建议。我会尽力让你知道。
    • 你好。您的解决方案帮助了我,我减少了内存使用量,现在它在 100MB 之间,这正是我想要的。非常感谢您的帮助!
    【解决方案2】:

    您的问题很可能是图像尺寸过大,请尝试将其压缩为 JPEG 格式。您可以使用压缩质量来寻找最佳位置。

    guard let imageRep = UIImageJPEGRepresentation(image, 0.3) else { return }
    

    【讨论】:

    • 感谢您的建议。我的图像已经压缩到 0.65,我还应该做更多吗?
    猜你喜欢
    • 2020-08-31
    • 1970-01-01
    • 2017-07-26
    • 2013-07-30
    • 2012-04-27
    • 1970-01-01
    • 2021-08-25
    • 2011-11-18
    • 2013-08-08
    相关资源
    最近更新 更多