美文网首页收藏ios
iOS关于tableView图片加载内存暴增甚至闪退的问题

iOS关于tableView图片加载内存暴增甚至闪退的问题

作者: 猜火车丶 | 来源:发表于2018-07-30 15:43 被阅读297次

    最近在接手一个项目,发现项目有一个页面特别容易闪退,在查看了各种原因后,发现页面在滚动的时候,内存增加的巨大,经过查看,了解到是SDWebImage在处理图片的时候引起的,版本号为3.8.2,因为项目特殊性,该库保持在该版本,据说4.+的版本已经修复了这个问题,没有经过实测,目前不清楚。

    具体问题:SDWebImage在下载高清大图后,会对图片进行解压缩操作,并且缓存起来,以保证tableView或collectionView交互更加流畅,但是如果是加载高分辨率图片的话,会适得其反,极有可能造成大量的内存消耗。

    我在查看到这个问题后,想好的处理这块的问题,想到了2点:
    1.项目的tableView需要进行优化。

    1. SDWebImage的这个问题需要处理。

    从第一点来说,有目的性的优化方案是:利用runloop的机制,在tableview滚动结束后再进行图片的加载。
    这里参考DWURunLoopWorkDistribution的代码,不过从体验上来说,滚动停止后才开始改变cell的具体图片,也就是说图片依然保持上次加载出来的状态,这种情况下的体验并不算太好,但是在这种情况下,性能得到了大大的提升。
    如果有更好的方案,希望不吝赐教。

    关于问题二就比较简单了,设置以下两个属性禁止解压缩操作:

        [[SDImageCache sharedImageCache] setShouldDecompressImages:NO];
        [[SDWebImageDownloader sharedDownloader] setShouldDecompressImages:NO];
    

    这个属性设置是全局性的,也就是在正常加载的情况下,可将属性更改为

        [[SDImageCache sharedImageCache] setShouldDecompressImages:YES];
        [[SDWebImageDownloader sharedDownloader] setShouldDecompressImages:YES];
    

    这里还有另外一个思路,如果后台提供相应的处理,那么,就是一个皆大欢喜的情况。
    1.后台限制上传图片的大小,或者做图片压缩。
    2.后端使用大小图的方式,以原图,压缩图,微缩图的情况传递给前端,前端根据情况进行相应项的加载。
    以上操作可以通过第三方平台达成,如果条件允许,可使用成熟的三方平台处理。

    苹果官网也有提供高清大图下载的demo,消耗较低,速度较慢,可做参考:
    https://developer.apple.com/library/ios/samplecode/LargeImageDownsizing/Introduction/Intro.html

    相关文章

      网友评论

        本文标题:iOS关于tableView图片加载内存暴增甚至闪退的问题

        本文链接:https://www.haomeiwen.com/subject/vovmyftx.html