在tableview中加载异步图像,它们在每次滚动时消失

Posted

技术标签:

【中文标题】在tableview中加载异步图像,它们在每次滚动时消失【英文标题】:loading asynchronous images in tableview, they disappear at every scroll 【发布时间】:2011-05-02 11:17:49 【问题描述】:

我正在解析一个 xml 文件,其中包含拇指图像的 url。我想在 uitableview 中显示这些拇指。

使用 AsyncImageView 类(在 this website 上找到),我的代码可以工作。

唯一的问题是:每次用户滚动 uitableview 时,图像都会消失片刻......然后重新出现(我认为我每次都在下载图像,但我不确定) !

这是一个丑陋的效果,我希望如果图像被下载,它仍然可见。

这是我的代码(注意:在 array_thumb 中有之前解析的 url):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

static NSString *CellIdentifier;
static NSString *NibNamed;

UIDeviceOrientation deviceOrientation = [UIApplication sharedApplication].statusBarOrientation;

if (deviceOrientation != UIDeviceOrientationLandscapeLeft &&
    deviceOrientation != UIDeviceOrientationLandscapeRight)

    CellIdentifier= @"Cell1";
    NibNamed = @"cell_gallery";

else

    CellIdentifier= @"Cell2";
    NibNamed = @"cell_gallery_landscape";


[[NSBundle mainBundle] loadNibNamed:NibNamed owner:self options:NULL];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];


if (cell == nil)

    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:NibNamed owner:self options:nil];
    cell = [nib objectAtIndex:0];

else 
    AsyncImageView* oldImage = (AsyncImageView*)[cell.contentView viewWithTag:1];
    [oldImage removeFromSuperview];


CGRect frame;
frame.size.width=72; frame.size.height=72;
frame.origin.x=10; frame.origin.y=10;
AsyncImageView* asyncImage = [[[AsyncImageView alloc] initWithFrame:frame] autorelease];

NSString *title = [NSString stringWithFormat:@"%@", [array_title objectAtIndex:indexPath.row]];
UILabel *testoLabel = (UILabel*)[cell viewWithTag:2];
testoLabel.text = title; 


asyncImage.tag = 1;

NSLog(@"%@", asyncImage);

NSURL *url = [NSURL URLWithString:[array_thumb objectAtIndex:indexPath.row]];   
asyncImage.layer.cornerRadius = 10.0;
asyncImage.layer.masksToBounds = YES;
[asyncImage loadImageFromURL:url];

[cell.contentView addSubview:asyncImage];


UIColor *miocolore1 = [[UIColor alloc] initWithRed:247.0 / 255 green:247.0 / 255 blue:247.0 / 255 alpha:1.0];
UIColor *miocolore2 = [[UIColor alloc] initWithRed:233.0 / 255 green:233.0 / 255 blue:233.0 / 255 alpha:1.0];

if (indexPath.row % 2 == 0) 
    cell.contentView.backgroundColor =  miocolore1;

else 
    cell.contentView.backgroundColor =  miocolore2;




return cell;



【问题讨论】:

【参考方案1】:

您的代码或 AsyncImageView 中没有任何内容表明图像已被缓存,因此看起来相同的图像被重复下载。

AsyncImageView 正在使用以下内容来加载图像:

[NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy];

您可能希望通过更改缓存策略来确保此处实际发生缓存。

我会检查 ASIHTTPRequest,它有一个很好的缓存实现。

【讨论】:

在撰写本文时,ASIHTTPRequest 的最后一个版本是三年前。查看AFNetworking。【参考方案2】:

由于单元格被重复使用,您必须自己提供数据。您可以将下载的图像保存为 NSData 或 UIImage 并提供要下载的 url,或者您可以使用已经下载的数据。 这样每次滚动时它都不会下载图像。

【讨论】:

以上是关于在tableview中加载异步图像,它们在每次滚动时消失的主要内容,如果未能解决你的问题,请参考以下文章

为啥偶尔会在 ListView 中加载错误的图像?

在 tableView 中加载 iPhone 磁盘图像(像照片应用程序)

每次我在 WPF 中加载时如何使 Listbox 的 ScrollViewer 滚动到顶部

如何实现 Asynctask 在 ArrayAdapter 中加载图像

在表格视图单元格中加载和缓存多个 UIImageView 不起作用

在 pyqt 中加载图像和文本