图片懒加载使用

这篇专题主要解决的问题有:

一、照片墙中图像数据未下载时,使用默认的占位图片

二、滑动时不加载图片,保持滑动的流畅性

 

合理高效的使用占位图片,是在用户和图像之前建立一层代理,用户不直接操作图片,而将所有与图片有关的操作放在代理对象当中。

贴一下ImageProxy的关键代码

#import "ImageProxcy.h"

@implementation ImageProxcy
{
  UIImage *realImage;
  BOOL hasLoadImage;
}
- (UIImage *) image { if (realImage == nil) { realImage = [[UIImage alloc] initWithContentOfFile:_filepath]; } return realImage; }

- (void)drawRect {
  if (realImage == nil) {
    // 此处可根据需要自定义绘制涂鸦

     if (!hasLoadImage) {
        [self image];

        [self performSelectorInBackGround:@selector(forwardLoadingThread) withObject:nil];

        hasLoadImage = YES;

    }
  }else {
    [realImage drawInRect:rect];
  }
}

- (void)forwardLoadingThread {
  [self image];

  [self performSelectorInBackground:@selector(setNeedsDisplay) withObject:nil];
}

@end

 -drawRect方法中若没加载图片,则显示自定义涂鸦,否则直接显示加载过的图片

 

下面谈下如何实现滑动时不加载图片,保持滑动的流畅性?

以tableView为例:

cellForRowAtIndexpath:方法中,监听tableView的滑动状态

if (tableView.isDargging == NO && tableView.isDecelerating == NO) {
   
      // tableView不滑动时,下载图片
  

       IconDownloader *dwnloader = [[IconDownloader alloc] init];

 
  

            [dwnloader startDownload:model.cover];

 
  

            dwnloader.completionHandler = ^(UIImage *resultImg) {

 
  

                [weakSelf setImage:resultImg indexPath:indexPath];

 
  

            };


}

判定tableView停止拖拽及滑动时,下载图片,图片下载完成后,使用闭包回调设置相应cell的图片

 

- (void)setImage:(UIImage *)image indexPath:(NSIndexPath *)indexpath {
    NSArray *visibleCellPath = _mTableView.indexPathsForVisibleRows;
    if ([visibleCellPath containsObject:indexpath]) {
        NBookCell *cell = [_mTableView cellForRowAtIndexPath:indexpath];
        cell.cover.image = image;
    }
    [imgCacheDic setObject:image forKey:indexpath];
}

闭包回调传入当前cell的indexpath,如果该cell仍然可见,则设置图片。

 

最终达到的效果是,滑动时显示placeHolder,停止滑动时则加载显示网络图片。

转载于:https://www.cnblogs.com/xiaoerheiwatu/p/9927088.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值