最近在接手一个项目,发现项目有一个页面特别容易闪退,在查看了各种原因后,发现页面在滚动的时候,内存增加的巨大,经过查看,了解到是SDWebImage在处理图片的时候引起的,版本号为3.8.2,因为项目特殊性,该库保持在该版本,据说4.+的版本已经修复了这个问题,没有经过实测,目前不清楚。
具体问题:SDWebImage在下载高清大图后,会对图片进行解压缩操作,并且缓存起来,以保证tableView或collectionView交互更加流畅,但是如果是加载高分辨率图片的话,会适得其反,极有可能造成大量的内存消耗。
我在查看到这个问题后,想好的处理这块的问题,想到了2点:
1.项目的tableView需要进行优化。
- 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