我正在加载一个包含500行的tableView。问题是在每一行中都有不同的图片。或者当我使用dequeueReusableCellWithIdentifier时,那些图片只是再次加载,我正在寻找的真实图片没有显示(我只有大约8张不同的图片:我的屏幕上加载了前8张图片)。如果我不使用dequeureReusableCellIdentifier,则会加载所有图片。但它会减慢显示吗?
这是代码(我目前正致力于缓存图片):
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CustomCellIdentifier = @"CustomCellIdentifier";
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier: CustomCellIdentifier];
NSLog(@"Launching CellForRowAtIndexPath");
if (cell == nil) {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell"
owner:self options:nil];
if ([nib count] > 0) {
cell = self.profilCell;
} else {
NSLog(@"failed to load CustomCell nib file!");
}
}
NSUInteger row = [indexPath row];
NSDictionary *rowData = [listProfils objectAtIndex:row];
UILabel *nameLabel = (UILabel *)[cell viewWithTag:nameValueTag];
nameLabel.text = [rowData objectForKey:@"name"];
NSString *finalId = [NSString stringWithFormat:@"http://graph.facebook.com/%@/picture", [rowData objectForKey:@"id"]];
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:finalId]]];
[profilPic setImage:image];
return cell;
}
感谢你! :)
答案 0 :(得分:1)
看起来你有一个ivar profilPic
可能是一个在你加载一个新的单元格笔尖时被链接的插座。如果是这种情况,它总是指向您加载的最后一个单元格,并且不会更改您刚刚出列的单元格中的图像。您可能希望以其他方式识别自定义视图,而不是使用插座,例如标记。因此,如果您将配置文件pic UIImageView
的标记设置为100,例如,在Interface Builder中,您可以执行以下操作:
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:finalId]]];
UIImageView* cellImageView = (UIImageView*)[cell viewWithTag:100];
[cellImageView setImage:image];
另外,我只想指出-dataWithContentsOfURL:
将在主线程上同步加载URL。如果您在快速连接上在模拟器中进行测试,这将非常有效。但是,如果你在星期五下午在SoHo上使用3G ...你的应用程序可能会被监管机构杀死。
答案 1 :(得分:0)
我刚遇到这个问题,我的解决方案是持有一个私有NSMutableDictionary
来存储以前从web异步加载的新图像,使用我的标识符作为键,UIImageView
作为对象(因为我需要首先加载图标图像),当web图像准备就绪时,更改它,当tableView
出列返回null时,我可以从我自己的缓存中读取原始UIImage
。
像这样。
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (!cell) {
UIImageView *imageView = [thumbnailCache objectForKey:identifier];
if (!imageView) {
cell.imageView.image = [UIImage imageNamed:@"icon.png"];
[thumbnailCache setObject:cell.imageView forKey:identifier];
} else {
cell.imageView.image = imageView.image;
}
}
当我从网上加载实际图片时,请刷新缩略图缓存。
asynchronously_load_image_from_web(^(UIImage *image) {
cell.imageView.image = image;
[thumbnailCache setObject:cell.imageView forKey:identifier];
});