Network

解决TableViewCell使用SDWebImage加载大量图

2017-04-06  本文已影响156人  我不相信me

   身为小白的我这个问题困扰我很久.工程写出来以后,模拟器根本不会发现问题所在(貌似电脑内存足够大).当你在真机测试使用的时候你就会发现Cell快速滑动,数据量大(图片数量)的时候app就会被系统Crash. 废话就不多说了,直接说本人解决过程吧.!!!

方向1:   从图片入手

方向2:  工程UITableView优化

方向3:  SDWebImage优化

方向1:  从图片入手

很多人都会忽略这个问题  都会往自己的代码工程这个方向去考虑 问题. 其实图片影响非常大. 如果图片质量2M,3M图片你直接放到cell上展示.不用想了 肯定是会卡成狗.  渲染这样的图片肯定需要很大内存.  所以往往你在开发的时候<<要跟后台商量.获取图片划分两个地址.一个地址获取缩略图,一个地址获取原图>> 这样你就可以在TableViewCell使用缩略图(展示用),点击图片查看(使用原图). 这样就大大减少了内存的使用.

方向2:  工程UITableView优化

这个普遍大家都会去关注使用的起来差不多!!     

1 高度缓存, cell 重用.. (不用说)

2 缓存Cell UI数据 比如高度 减少计算 (Model去缓存,或者使用工具SDAutoLayout)

3 Cell减少重复创建View (懒加载  一般cell局部规格都不一样都是根据数据来适配view<比如朋友圈> 所以你可以先创建好view放进数组 根据图片数组的长度获取view的个数去展示view ) 下面是我用SDAutoLayout代码

方向3:  SDWebImage优化

SDWebImage 使用

到这里一般的数据足够使用 但是图片数量大的依旧内存会出现问题  接下就参考网上的一篇博客 完美解决问题

博客地址:   http://blog.csdn.net/benyoulai5/article/details/50462586

SDWebImage 优化

1 找到这个位置 

复制    复制到上面文件中去实现第一步方法

+(UIImage *)compressImageWith:(UIImage *)image

{

float imageWidth = image.size.width;

float imageHeight = image.size.height;

float width = 640;

float height = image.size.height/(image.size.width/width);

float widthScale = imageWidth /width;

float heightScale = imageHeight /height;

// 创建一个bitmap的context

// 并把它设置成为当前正在使用的context

UIGraphicsBeginImageContext(CGSizeMake(width, height));

if (widthScale > heightScale) {

[image drawInRect:CGRectMake(0, 0, imageWidth /heightScale , height)];

}

else {

[image drawInRect:CGRectMake(0, 0, width , imageHeight /widthScale)];

}

// 从当前context中创建一个改变大小后的图片

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

// 使当前的context出堆栈

UIGraphicsEndImageContext();

return newImage;

}

第二步 

这样基本解决内存问题 具体解释可以参考上面博客!!!

上一篇下一篇

猜你喜欢

热点阅读