我想将图像保存到TableViewcontroller的缓存中。我编写了以下代码,但cacheImage始终为nil。
@property (nonatomic,strong)NSCache *imageCache;
@synthesize imageCache;
- (void)viewDidLoad
{
[super viewDidLoad];
self.imageCache = [[NSCache alloc] init];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
cell.textLabel.text = [[tableData objectAtIndex:indexPath.row] valueForKey:@"name"];
cell.textLabel.font = [UIFont fontWithName:@"BebasNeue" size:24];
cell.textLabel.textColor = [UIColor whiteColor];
UIImage *cachedImage = [imageCache objectForKey:@"indexObject"];
if (cachedImage) {
dispatch_async(dispatch_get_main_queue(), ^{
cell.imageView.image = cachedImage;
});
}
else {
NSString *imageURLString=[[tableData objectAtIndex:indexPath.row] valueForKey:@"picture"];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSURL *url = [NSURL URLWithString:imageURLString];
NSData *data = [[NSData alloc] initWithContentsOfURL:url];
UIImage *tmpImage = [[UIImage alloc] initWithData:data];
dispatch_async(dispatch_get_main_queue(), ^{
UITableViewCell *newsCell = [self.grillMenuTable cellForRowAtIndexPath:indexPath];
[imageCache setObject:tmpImage forKey:@"indexObject"];
if (newsCell)
{
newsCell.imageView.image=tmpImage;
[newsCell setNeedsLayout];
}
});
});
}
return cell;
}
我使用以下代码作为Joe建议,但仍然是cell.imageview.image总是无。
NSString *imageURLString=[[tableData objectAtIndex:indexPath.row] valueForKey:@"picture"];
[[DLImageLoader sharedInstance] loadImageFromUrl:imageURLString
completed:^(NSError *error, UIImage *imgData) {
cell.imageView.image = imgData;
}];
答案 0 :(得分:1)
不要试图重新发明轮子。您应该使用外部库来做到这一点,有一些很好的例子。看看SDWebImage,它完全符合您的要求。
使用它,你可以忘记队列,手动缓存......只需导入标题:
#import <SDWebImage/UIImageView+WebCache.h>
并且,在您的tableView:cellForRowAtIndexPath:
方法中,您只需将图片设置为UIImageView
,其中setImageWithURL:
(或其任何变体:带占位符等)方法由图书馆:
NSString* imageURL = [[tableData objectAtIndex:indexPath.row] valueForKey:@"picture"];
[cell.imageView setImageWithURL:[NSURL URLWithString:imageURL]];
这就是全部。图书馆会为您处理一切。如果你想以某种方式管理它后面的缓存并配置它,你可以使用SDWebImageManager
类(GitHub页面中的更多信息)。
答案 1 :(得分:0)