向上滚动时,uitableview中异步加载的图像消失

时间:2014-01-09 06:26:48

标签: ios uitableview uiimageview

我能够异步地获取图像到uitableview.i我正在获取这些图像来自url.on向上滚动uitableview这些图像消失,他们需要时间再次加载,有时他们根本不加载。我不想使用任何第三方库。我不想采用同步方法。请建议任何正确的方法来提高性能。谢谢提前帮助。我的代码如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *identifier=@"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"identifier"];
}
UIImageView *imgVw=[[UIImageView alloc]initWithFrame:CGRectMake(250, 10, 40, 30)];
[cell.contentView addSubview:imgVw];
Attributes *att = [listOfObjects objectAtIndex:indexPath.row];
strImgUrl=@"http:image url";
strImgName=att.classifiedImg;
if (strImgName == nil) {
    UIImage *myImg=[UIImage imageNamed:@"user_circle.png"];
    imgVw.image=myImg;
}
else{
    strImg=[strImgUrl stringByAppendingString:strImgName];
}
dispatch_async(dispatch_get_global_queue(0,0), ^{
    NSData *data = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString:strImg]];
    if ( data == nil )
        return;
    dispatch_async(dispatch_get_main_queue(), ^{

        UIImage *img=[UIImage imageWithData: data];
        imgVw.image=img;
    });

});



return cell;
}

2 个答案:

答案 0 :(得分:2)

UITableViews旨在重用单元格。例如,当您向上滚动时,第一个单元格可能会被重复使用以显示第5个单元格,因为第一个单元格现在不在屏幕上。当您向后滚动时,再次调用cellForRowAtIndexPath,并且您再次同步下载相同的图像。如果你想立即加载它,你需要在第一次下载图像后缓存它们,这样下次需要图像时你可以直接从缓存中拉出它。

许多第三方库都这样做(AFNetworking),但如果您不想使用它们,则必须手动缓存图像。

答案 1 :(得分:0)

您的重用代码似乎包含bug,这会导致每次都创建新的单元格。以下代码使用reuseIdentifier作为@"identifier"

if (cell == nil) {
   cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"identifier"];
}

将其更改为:

if (cell == nil) {
   cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier];
}

编辑:

重新使用tableView单元格时,您不需要每次都为单元格创建和添加子视图。相反,只需在创建单元格时创建子视图,然后如果单元格正在重复使用,只需使用标记获取子视图并从数据源更新内容。

您的代码可以修改如下:

if (cell == nil) {
   cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier];
   UIImageView *imgVw=[[UIImageView alloc]initWithFrame:CGRectMake(250, 10, 40, 30)];
   imgVw.tag = indexPath.row;
   [cell.contentView addSubview:imgVw];
}
UIImageView imgVw = (UIImageView*)[cell.contentView viewWithTag:indexPath.row];
//Rest is same as you posted.

希望这能解决问题。