我有一个包含4张照片的UITableViewCell,我从网上获取这些照片,但问题是当我向下滚动UITableView时这些照片再次下载
这是代码:
ITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellPhoto"];
if (cell == nil) {
NSArray *nibObject = [[NSBundle mainBundle] loadNibNamed:@"CustomCellThumbnails" owner:self options:nil];
cell = [nibObject objectAtIndex:0];
}
// Get the photos
int getPhotos = indexPath.row * 4;
for (int i = 1; i <= 4; i++) {
if (getPhotos < [imageArray count])
{
UIButton *imageButton = (UIButton*)[cell viewWithTag:i];
NSString *url = [imageArray objectAtIndex:getPhotos];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.siteweb.com%@",url]]];
UIImage *imageFieldProfile = [[UIImage alloc] initWithData:imageData];
dispatch_async(dispatch_get_main_queue(), ^{
// Set the phoyo to the UIButton
[imageButton setBackgroundImage:imageFieldProfile forState:UIControlStateNormal];
[imageFieldProfile release];
// Set the corner of UIButton
[imageButton.layer setCornerRadius:5.0];
[imageButton.layer setMasksToBounds:YES];
imageButton.tag = getPhotos;
});
});
[imageButton addTarget:self action:@selector(displayPhoto:) forControlEvents:UIControlEventTouchUpInside];
}
getPhotos ++;
}
答案 0 :(得分:1)
您应该使用视图控制器来填充单元格,而不是UITableViewCell。如果你这样做,它不仅是一种更好的编码风格,而且保存数据也更容易。
无论如何,如果您真的必须:使用某种存储表初始化UITableViewCell,以便您可以存储下载的数据:将initWithStyle:reuseIdentifier:
重写为initWithStyle:reuseIdentifier:usingCacheTable:
但是,再一次,正确的方法是在视图控制器中加载数据,让UIView
子类只显示内容。
答案 1 :(得分:0)
您应该在下载图像时将图像保存或缓存在另一个对象中,而不是在表格视图单元格中。也许使用某种数据源或模型对象,表视图单元从中请求图像,而不是让表视图单元直接发出任何URL请求。然后,模型对象可以在下载之后以及将它们交给单元格之前缓存图像。
答案 2 :(得分:0)
您可以将延迟加载图像视图与本地缓存结合使用。使用ASIHTTPRequest和正确设置的缓存标志可以很容易地实现这一点。
ASIHTTPRequest非常易于使用,其缓存非常易于控制。
与建议的其他解决方案相比,我会坚持使用UITableView
及其UITableViewCells
,因为这将允许您使用de / queued单元格而无需自己构建此类逻辑。
我已将这种解决方案用于主要的新闻杂志应用程序(超过2个月的下载量),我对结果非常满意。