IOS延时加载网络图片

 

   
重网上下载图片是很慢的,为了不影响体验,选择延时加载图片是很好的办法。
iOS延时加载图片
一个tableView 列表,左边暂时没有图

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

{

static NSString *CellIdentifier = @"myCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)

{

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle

  reuseIdentifier:CellIdentifier] autorelease];

cell.selectionStyle = UITableViewCellSelectionStyleNone;

    }

        // 设置cell一些数据

        AppRecord *appRecord = [self.entries objectAtIndex:indexPath.row];

        

cell.textLabel.text = appRecord.appName;

        cell.detailTextLabel.text = appRecord.artist;

        // 如果不存在图片

        if (!appRecord.appIcon)

        {

            if (self.tableView.dragging == NO && self.tableView.decelerating == NO)//不在拖动中和减速时,开始下载图片

            {

                [self startIconDownload:appRecord forIndexPath:indexPath];

            }

            //设置图片为空白图片(等待下载)

            cell.imageView.image = [UIImage imageNamed:@"Placeholder.png"];                

        }

//如果有图片

        else

        {

           cell.imageView.image = appRecord.appIcon;

        }

    

    return cell;

}

 
关键就是[self startIconDownload:appRecord forIndexPath:indexPath];

- (void)startIconDownload:(AppRecord *)appRecord forIndexPath:(NSIndexPath *)indexPath

{

    IconDownloader *iconDownloader = [imageDownloadsInProgress objectForKey:indexPath];

    if (iconDownloader == nil) //已经在下载中的不用重复下载了,没有在下载中就往下走

    {

        iconDownloader = [[IconDownloader alloc] init];

        iconDownloader.appRecord = appRecord;

        iconDownloader.indexPathInTableView = indexPath;

        iconDownloader.delegate = self;

        [imageDownloadsInProgress setObject:iconDownloader forKey:indexPath];

        [iconDownloader startDownload];

        [iconDownloader release];   

    }

}


IconDownloader 是一个下载图片封装类
关键方法:iconDownloader.delegate = self;
[iconDownloader startDownload];
 
一个是委托,将来告诉self下载完成更新图片
一个是自己方法开始联网下载图片
 
委托调用方法,重设图片

- (void)appImageDidLoad:(NSIndexPath *)indexPath

{

    IconDownloader *iconDownloader = [imageDownloadsInProgress objectForKey:indexPath];

    if (iconDownloader != nil)

    {

        UITableViewCell *cell = [self.tableViewcellForRowAtIndexPath:iconDownloader.indexPathInTableView];

        

        cell.imageView.image = iconDownloader.appRecord.appIcon;

    }

}

 
类IconDownloader 中的方法

- (void)startDownload

{

    self.activeDownload = [NSMutableData data];

    NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:

                             [NSURLRequest requestWithURL:

                              [NSURL URLWithString:appRecord.imageURLString]] delegate:self];

    self.imageConnection = conn;

    [conn release];

}

最后 NSURLConnection的委托需要自己实现了。
原文地址:https://www.cnblogs.com/worldtraveler/p/4569442.html