SDWebImage加载多张图片卡顿闪退

网上有很多关于卡顿的解决办法,这里就不在一一列举,有很多方法我都试过,不过并不完全有用,因为我们后台给的图片是5000*5000这种超高分辨率的图片,所以在转data的时候造成内存消耗非常大,那么解决办法就很清楚了。搜索sd_imageWithData:方法,在image创建之后对image做处理:

+ (UIImage *)sd_imageWithData:(NSData *)data {

if (!data) {

return nil;

}

UIImage *image;

NSString *imageContentType = [NSData sd_contentTypeForImageData:data];

if ([imageContentType isEqualToString:@"image/gif"]) {

image = [UIImage sd_animatedGIFWithData:data];

}

#ifdef SD_WEBP

else if ([imageContentType isEqualToString:@"image/webp"])

{

image = [UIImage sd_imageWithWebPData:data];

}

#endif

else {

image = [[UIImage alloc] initWithData:data];

if (data.length/1024 > 128) {

image = [self compressImageWith:image];

}

UIImageOrientation orientation = [self sd_imageOrientationFromImageData:data];

if (orientation != UIImageOrientationUp) {

image = [UIImage imageWithCGImage:image.CGImage

scale:image.scale

orientation:orientation];

}

}

return image;

}

将上面的代码替换掉原先方法即可。

+(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;

}

你可能感兴趣的:(SDWebImage加载多张图片卡顿闪退)