如何在没有内存警告的情况下在uitableview中异步加载图像?

时间:2013-01-03 06:37:24

标签: ios image uitableview asynchronous crash

您好iam开发一个应用程序,我将从Web服务获取图像并在tableview中加载图像。我异步加载图像。问题是我的应用程序在滚动tableview时崩溃,在日志中它显示内存接收警告。同样的图像在许多行中重复。也需要更多的时间来加载。我使用下面的代码。

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

{     static NSString * CellIdentifier = @“Cell”;

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    /*   UILabel * cellLabel=[[UILabel alloc] initWithFrame:CGRectMake(0, 50, cell.frame.size.width-20, 45)];
     cellLabel.textColor=[UIColor blackColor];
     cellLabel.backgroundColor=[UIColor clearColor];
     cellLabel.tag=2;
     [cell.contentView addSubview:cellLabel];*/

    cell.selectionStyle=UITableViewCellSelectionStyleNone;

    cell.backgroundView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"list_iPhone.png"]];


    UIImageView *imv = [[UIImageView alloc]initWithFrame:CGRectMake(10,18, 48, 48)];
    imv.tag=4;
    imv.image=[UIImage imageNamed:@"ImagePlaceholder.png"];


    [cell.contentView addSubview:imv];

    UIImageView *arrwimv = [[UIImageView alloc]initWithFrame:CGRectMake(260,35, 14, 17)];
    arrwimv.image=[UIImage imageNamed:@"arrw_iPhone.png"];

    [cell.contentView addSubview:arrwimv];



    UILabel *descriptionLbl=[[UILabel alloc] initWithFrame:CGRectMake(100, 27, 450, 45)];
    descriptionLbl.font=[UIFont CITY311_TitleFontWithSize:18];
    descriptionLbl.tag=1;
    descriptionLbl.textAlignment=UITextAlignmentLeft;
    descriptionLbl.textColor=[UIColor blackColor];
    descriptionLbl.backgroundColor=[UIColor clearColor];
    [cell.contentView addSubview:descriptionLbl];

    UILabel *descriptionLbl2=[[UILabel alloc] initWithFrame:CGRectMake(100, 5, 450, 45)];
    descriptionLbl2.font=[UIFont CITY311_TitleFontWithSize:18];
    descriptionLbl2.tag=2;
    descriptionLbl2.textAlignment=UITextAlignmentLeft;
    descriptionLbl2.textColor=[UIColor blackColor];
    descriptionLbl2.backgroundColor=[UIColor clearColor];
    [cell.contentView addSubview:descriptionLbl2];


}
UIImageView *imv2=(UIImageView *)[cell.contentView viewWithTag:4];

dispatch_async(mainQueue, ^(void) {

    if(![[[issueArray objectAtIndex:indexPath.row]objectForKey:@"PhotoUrl"] isEqualToString:@""])
    {

        NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:[[issueArray objectAtIndex:indexPath.row]objectForKey:@"PhotoUrl"]]];
        UIImage* image = [[UIImage alloc] initWithData:imageData];

        imv2.image = image;

    }


});


UILabel *lbl=(UILabel *)[cell.contentView viewWithTag:1];
lbl.text=[[issueArray objectAtIndex:indexPath.row] objectForKey:@"issueSubmittedDate"];


UILabel *lbl2=(UILabel *)[cell.contentView viewWithTag:2];
lbl2.text=[[issueArray objectAtIndex:indexPath.row] objectForKey:@"IssueName"];

return cell;

}

在视图中加载

mainQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

在.h文件中

dispatch_queue_t mainQueue;

请在没有任何内存警告(崩溃)的情况下帮助正确加载图像。提前感谢。

1 个答案:

答案 0 :(得分:0)

你正在重复使用tableviewcells。当一个单元格离开屏幕时,它将被放在一边,以便您可以重复使用该对象。当您执行dequeueReusableCellWithIdentifier时,您可以获得已包含图像的“旧”单元格。如果您不清除该单元格中的数据,您将看到旧数据(图像),直到下载新图像。

在if(cell == nil)中,您应该只创建单元格并设置每行相同的属性。设置并清除以下数据,如果。

崩溃可能是因为在初始回调准备好之前,单元格可以移出视图并重新用于另一行。尝试将标识符设置为唯一值。就像是: NSString * CellIdentifier = [NSString stringWithFormat:@“Cell%d”,indexPath.Row]; 只有在行数较少时才保留代码。否则你可能会遇到内存问题。

您可以尝试使用https://github.com/rs/SDWebImage

之类的内容,而不是尝试自行修复