SDWebImage加载大图导致程序闪退
2017-07-12 本文已影响518人
FallPine
一直加载图片都是用的SDWebImage这个框架,今天在加载多张图片的时候,程序突然崩溃了,真是一脸闷逼,找了好久,最后发现是加载图片导致的。于是上网搜索了一下,原来很多人也遇到了这个问题,按照网上大神提供的方法进行了修改,问题就解决了。
修改SDWebImage框架中的UIImage+MultiFormat.m文件,添加一个等比压缩图片的方法
+(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;
}
然后还是在这个文件中,在+ (UIImage *)sd_imageWithData:(NSData *)data方法中,对一些大图进行压缩
+ (UIImage *)sd_imageWithData:(NSData *)data {
.......
#ifdef SD_WEBP
else if ([imageContentType isEqualToString:@"image/webp"])
{
image = [UIImage sd_imageWithWebPData:data];
}
#endif
else {
image = [[UIImage alloc] initWithData:data];
// 大于300k就对图片进行压缩
if (data.length/1024 > 300) {
image = [self compressImageWith:image];
}
......
return image;
}
最后,还要在SDWebImageDownloaderOperation中,参考文章是在connectionDidFinishLoading方法中修改,但我没找到这个方法,最后实在- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error这个方法中进行的修改
在下面代码下方
UIImage *image = [UIImage sd_imageWithData:self.imageData];
添加一下代码
// 将等比压缩过的image在赋在转成data赋给self.imageData
NSData *data = UIImageJPEGRepresentation(image, 1);
self.imageData = [NSMutableData dataWithData:data];
不知我这么改会不会有其他的问题,但闪退的问题是解决了。以后有修改会再做补充