我使用SDWebImage
来缓存图片。但它不起作用。我在cellForRowAtIndexPath
下以这种方式使用它:
[cell.image sd_setImageWithURL:[NSURL URLWithString:[NSMutableString stringWithFormat:@"%@app/media/access/pictures?p=%@",baseurl,data.picPath]]
placeholderImage:[UIImage sd_animatedGIFNamed:@"image_loader.gif"] options:SDWebImageRefreshCached];
我想它是异步下载图像的。但我的应用程序在滚动UITableView
时会冻结。滚动时也有网络使用,对我而言,当我缓存它时不应该发生。
除了根据UIImageView
下的图像大小,我有一些逻辑来调整heightForRowAtIndexPath
帧的大小,这可能是什么原因???
if(data.type == 2)
{
height = 260.00;
}
else if(data.type == 1)
{
height = self.view.frame.size.width/2 + 115;
}
else
{
NSString *filePath = [NSString stringWithFormat:@"%@app/media/access/pictures?p=%@",baseurl,data.picPath];
self.img = [UIImage imageWithData: [NSData dataWithContentsOfURL:[NSURL URLWithString:filePath]]];
if (self.img.size.width > CGRectGetWidth(self.view.bounds)) {
CGFloat ratio = self.img.size.height / self.img.size.width;
return CGRectGetWidth(self.view.bounds) * ratio+120;
} else {
return self.img.size.height+110;
}
}
答案 0 :(得分:3)
这是肯定的:
self.img = [UIImage imageWithData: [NSData dataWithContentsOfURL:[NSURL URLWithString:filePath]]];
为什么要再次下载图片?您应该始终使用SDWebImage
。
<强>添加强> 而不是做
NSString *filePath = [NSString stringWithFormat:@"%@app/media/access/pictures?p=%@",baseurl,data.picPath];
self.img = [UIImage imageWithData: [NSData dataWithContentsOfURL:[NSURL URLWithString:filePath]]];
您需要在heightForRow
等待异步块之前下载图像。尝试使用SDWebImage sharedDownloader
预加载它们。然后他们将在缓存中。
答案 1 :(得分:1)
heightForRowAtIndexPath
中的以下代码导致问题:
NSString *filePath = [NSString stringWithFormat:@"%@app/media/access/pictures?p=%@",baseurl,data.picPath];
self.img = [UIImage imageWithData: [NSData dataWithContentsOfURL:[NSURL URLWithString:filePath]]];
每次滚动tableView时都会执行代码,因为它不是异步调用,所以会导致冻结问题。
<强> 编辑: 强> 为了避免这种情况,你可以这样做:
完成下载后即可使用,
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil]
withRowAnimation:UITableViewRowAnimationAutomatic];
这将再次致电
-(CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath
像,
[cell.image sd_setImageWithURL:[NSURL URLWithString:[NSMutableString stringWithFormat:@"%@app/media/access/pictures?p=%@",baseurl,data.picPath]]
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
if (error) {
NSLog(@"error: %@",error.description);
}
else{
//get image height and return this height from HeightForRowAtIndexPath
Height=image.size.height;
//reloading row will call heightForRowAtIndexPath,where now you can return height got above
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationAutomatic];
NSLog(@"Not an error in image download");
}
}];
<强> EDIT1 强>:
要检查已经缓存的图像,可以使用SDWebImage库的下面方法:
- (BOOL)diskImageExistsWithKey:(NSString *)key;
缓存键是要缓存的映像的应用程序唯一标识符。它通常是图像的绝对URL。
现在如果图像存在于缓存中,则使用SDWebImage Library的以下方法获取图像路径:
- (NSString *)defaultCachePathForKey:(NSString *)key;
- (NSString *)cachedFileNameForKey:(NSString *)key;
您可以像这样获取图片的路径:
NSString *ImageKey;//key for the image you want the path for
[[SDImageCache sharedImageCache] defaultCachePathForKey:ImageKey];
如果您不使用默认位置,可以使用:
- (NSString *)cachePathForKey:(NSString *)key inPath:(NSString *)path;
有关详细信息,请点击此处:SDWebImage
答案 2 :(得分:0)
答案 3 :(得分:0)
https://github.com/rs/SDWebImage
你可以看一下这个库