集合视图单元格中的图像不正确
Images are not correct in collection view cells
我使用 sdwebimage 来缓存图像。
现在 imagesArr 是我想首先为所有单元格显示的图像数组。
我正在后台下载图像,然后保存到磁盘中,所以当我想在离线模式下使用这些图像时,我可以从磁盘中获取这些图像。
但在某些情况下,当我滚动 collectionView 时图像设置不正确,然后再次滚动图像似乎是正确的。
这是我在 cellForItemAtIndexPath 中实现的以下代码。我试过调试,但似乎数据是正确的,图像名称也是正确的。
此外,collectionView 的滚动也很滞后。请帮我找出问题所在。
if(imagesArr.count>0)
{
ClothesImage *obj_image=[imagesArr objectAtIndex:0];
NSString *fileName = [stringPath stringByAppendingFormat:@"/%@",obj_image.imagePath];
NSLog(@"FILES NAMES %@ ", obj_image.imagePath);
NSData *data = [NSData dataWithContentsOfFile:fileName];
if(data!=nil){
UIImage *image=[UIImage imageWithData:data];
cell.imgProduct.image=image;
}
else{
NSString *offline=[user_defaults objectForKey:@"offline"];
if([offline integerValue]==0){
cell.imgProduct.image=[UIImage imageNamed:@"noImageThumb"];
NSString *str_url=[NSString stringWithFormat:@"%@/%@",WEB_THUMB_IMAGE,obj_image.imagePath];
str_url = [NSString stringWithFormat: @"%@",[str_url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[cell.imgProduct setImageWithURL:[NSURL URLWithString:str_url] placeholderImage:[UIImage imageNamed:@"noImageThumb"] options: SDWebImageRefreshCached];
SDWebImageManager *manager = [SDWebImageManager sharedManager];
[manager downloadWithURL:[NSURL URLWithString:str_url] options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) {
NSString *stringPathImage = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]stringByAppendingPathComponent:@"WebThumb"];
NSData *data = [NSData dataWithData:UIImagePNGRepresentation(image)];
NSString *fileName = [stringPathImage stringByAppendingFormat:@"/%@",obj_image.imagePath];
[data writeToFile:fileName atomically:YES];
NSLog(@"DOWNLOADED IMAGE %@",fileName);
}];
}
else
{
cell.imgProduct.image=[UIImage imageNamed:@"noImageThumb"];
}
}
} else{
cell.imgProduct.image=[UIImage imageNamed:@"noImageThumb"];
}
我认为有几种方法可以改善这一点。
您似乎在重复 SDWebImage 将为您做的很多工作。该库将缓存图像并按需获取它们。您应该考虑让该库将您的文件预取到缓存中,而不是您自己尝试预取并将它们写出到磁盘。最终当你进入 -cellForRowAtIndexPath
时,你只需要两种情况:一种是在设备离线时设置图像,另一种是从缓存中获取或设置图像,SDWebImage 为你提供:
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
就是这样。您所做的所有缓存和切换都不是必需的。另一件要确定的事情是在你的单元格子类方法 -prepareForReuse
中,你正在消除图像。
我使用 sdwebimage 来缓存图像。 现在 imagesArr 是我想首先为所有单元格显示的图像数组。 我正在后台下载图像,然后保存到磁盘中,所以当我想在离线模式下使用这些图像时,我可以从磁盘中获取这些图像。
但在某些情况下,当我滚动 collectionView 时图像设置不正确,然后再次滚动图像似乎是正确的。
这是我在 cellForItemAtIndexPath 中实现的以下代码。我试过调试,但似乎数据是正确的,图像名称也是正确的。
此外,collectionView 的滚动也很滞后。请帮我找出问题所在。
if(imagesArr.count>0)
{
ClothesImage *obj_image=[imagesArr objectAtIndex:0];
NSString *fileName = [stringPath stringByAppendingFormat:@"/%@",obj_image.imagePath];
NSLog(@"FILES NAMES %@ ", obj_image.imagePath);
NSData *data = [NSData dataWithContentsOfFile:fileName];
if(data!=nil){
UIImage *image=[UIImage imageWithData:data];
cell.imgProduct.image=image;
}
else{
NSString *offline=[user_defaults objectForKey:@"offline"];
if([offline integerValue]==0){
cell.imgProduct.image=[UIImage imageNamed:@"noImageThumb"];
NSString *str_url=[NSString stringWithFormat:@"%@/%@",WEB_THUMB_IMAGE,obj_image.imagePath];
str_url = [NSString stringWithFormat: @"%@",[str_url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[cell.imgProduct setImageWithURL:[NSURL URLWithString:str_url] placeholderImage:[UIImage imageNamed:@"noImageThumb"] options: SDWebImageRefreshCached];
SDWebImageManager *manager = [SDWebImageManager sharedManager];
[manager downloadWithURL:[NSURL URLWithString:str_url] options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) {
NSString *stringPathImage = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]stringByAppendingPathComponent:@"WebThumb"];
NSData *data = [NSData dataWithData:UIImagePNGRepresentation(image)];
NSString *fileName = [stringPathImage stringByAppendingFormat:@"/%@",obj_image.imagePath];
[data writeToFile:fileName atomically:YES];
NSLog(@"DOWNLOADED IMAGE %@",fileName);
}];
}
else
{
cell.imgProduct.image=[UIImage imageNamed:@"noImageThumb"];
}
}
} else{
cell.imgProduct.image=[UIImage imageNamed:@"noImageThumb"];
}
我认为有几种方法可以改善这一点。
您似乎在重复 SDWebImage 将为您做的很多工作。该库将缓存图像并按需获取它们。您应该考虑让该库将您的文件预取到缓存中,而不是您自己尝试预取并将它们写出到磁盘。最终当你进入 -cellForRowAtIndexPath
时,你只需要两种情况:一种是在设备离线时设置图像,另一种是从缓存中获取或设置图像,SDWebImage 为你提供:
[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
就是这样。您所做的所有缓存和切换都不是必需的。另一件要确定的事情是在你的单元格子类方法 -prepareForReuse
中,你正在消除图像。