仔细观察你会发现,只有在滑动停止的时候才会加载图片。
实现起来其实很简单
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = nil;
NSUInteger nodeCount = self.entries.count;//self.entries是放cellModel的数组
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
// Leave cells empty if there's no data yet
if (nodeCount > 0)
{
// 从数组中取出model 给cell赋值
AppRecord *appRecord = self.entries[indexPath.row];
cell.textLabel.text = appRecord.appName;
cell.detailTextLabel.text = appRecord.artist;
if (!appRecord.appIcon)//如果cell的图片不存在
{ //判断tableView此刻有没有在滑动,如果未在滑动中
if (self.tableView.dragging == NO && self.tableView.decelerating == NO)
{ //那么下载新的images赋给cell
[self startIconDownload:appRecord forIndexPath:indexPath];
}
// 使用占位图
cell.imageView.image = [UIImage imageNamed:@"Placeholder.png"];
}
else//如果cell的图片存在
{
cell.imageView.image = appRecord.appIcon;
}
}
return cell;
}
//在代理方法中检测到滑动结束,加载图片
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
if (!decelerate)
{
[self loadImagesForOnscreenRows];
}
}
//在代理方法中检测到滑动减速结束,加载图片
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
[self loadImagesForOnscreenRows];
}
- (void)loadImagesForOnscreenRows
{
if (self.entries.count > 0)
{ //获取可见区域所有cell的indexPath数组
NSArray *visiblePaths = [self.tableView indexPathsForVisibleRows];
for (NSIndexPath *indexPath in visiblePaths)
{ //遍历每个cell的model
AppRecord *appRecord = self.entries[indexPath.row];
//如果image不存在
if (!appRecord.appIcon)
{ //才下载
[self startIconDownload:appRecord forIndexPath:indexPath];
}
}
}
}
以上是全部核心代码
官方的demo下载地址:https://developer.apple.com/library/content/samplecode/LazyTableImages/Introduction/Intro.html