cell下载图片思路 – 无沙盒缓存

cell下载图片思路 – 无沙盒缓存

/**
 *  1.
会阻塞主线程  -  影响用户体验
 *  2.
重复下载  -  浪费流量,浪费时间,影响用户体验
 */

//  保证: 1 张图片只下载 1

/**
 * 
所有的应用数据
 */

@property ( nonatomic , strong ) NSMutableArray *apps;

/**
 * 
存放所有下载操作的队列
 */

@property ( nonatomic , strong ) NSOperationQueue *queue;

/**
 * 
存放所有的下载操作( url key operation 对象是 value
 */

@property ( nonatomic , strong ) NSMutableDictionary *operations;

/**
 * 
存放所有下载完的图片
 */

@property ( nonatomic , strong ) NSMutableDictionary *images;
@end

@implementation HMAppsViewController

#pragma mark - 懒加载
- ( NSMutableArray *)apps
{
   
if (! _apps ) {
       
// 1. 加载 plist
       
NSString *file = [[ NSBundle mainBundle ] pathForResource : @"apps" ofType : @"plist" ];
       
NSArray *dictArray = [ NSArray arrayWithContentsOfFile :file];
       
       
// 2. 字典 --> 模型
       
NSMutableArray *appArray = [ NSMutableArray array ];
       
for ( NSDictionary *dict in dictArray) {
            HMApp *app = [HMApp appWithDict:dict];
            [appArray addObject:app];
        }
       
       
// 3. 赋值
       
self . apps = appArray;

    }
   
return _apps ;
}

- (
NSOperationQueue *)queue
{
   
if (! _queue ) {
       
self . queue = [[ NSOperationQueue alloc ] init ];
    }
   
return _queue ;
}

- (
NSMutableDictionary *)operations
{
   
if (! _operations ) {
       
self . operations = [[ NSMutableDictionary alloc ] init ];
    }
   
return _operations ;
}

- (
NSMutableDictionary *)images
{
   if(!_images) {
       self.images= [[NSMutableDictionaralloc]init];
    }
   
return _images ;
}

#pragma mark - 初始化方法
- ( void )viewDidLoad
{
    [
super viewDidLoad ];
   
   
// 这里仅仅是 block self 进行了引用, self block 没有任何引用
    [
UIView animateWithDuration : 2.0 animations :^{
       
self . view . frame = CGRectMake ( 0 , 0 , 100 , 100 );
    }];
}

- (
void )didReceiveMemoryWarning
{
    [
super didReceiveMemoryWarning ];
   
   
// 移除所有的下载操作缓存
    [
self . queue cancelAllOperations ];
    [
self . operations removeAllObjects ];
   
// 移除所有的图片缓存
    [
self . images removeAllObjects ];
}

#pragma mark - Table view data source
- ( NSInteger )tableView:( UITableView *)tableView numberOfRowsInSection:( NSInteger )section
{
   
return self . apps . count ;
}

- (
UITableViewCell *)tableView:( UITableView *)tableView cellForRowAtIndexPath:( NSIndexPath *)indexPath
{
   
static NSString *ID = @"app" ;
   
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier :ID];
   
if (!cell) {
        cell = [[
UITableViewCell alloc ] initWithStyle : UITableViewCellStyleSubtitle reuseIdentifier :ID];
    }
   
   
// 取出模型
    MVApp *app =
self .apps[indexPath.row];
   
   
// 设置基本信息
    cell.textLabel.text = app.name;
    cell.detailTextLabel.text = app.download;
   
   
// 先从 images 缓存中取出图片 url 对应的 UIImage
   
UIImage *image = self .images[app.icon];
   
if (image) { // 说明图片已经下载成功过(成功缓存)
        cell.
imageView . image = image;
    }
else { // 说明图片并未下载成功过(并未缓存过)
       
// 显示占位图片
        cell.
imageView . image = [ UIImage imageNamed : @"placeholder" ];
       
       
// 下载图片
        [
self download:app.icon indexPath:indexPath];
    }
   
   
return cell;
}

/**
 * 
下载图片
 *
 * 
@param imageUrl 图片的 url
 */

- (
void )download:( NSString *)imageUrl indexPath:( NSIndexPath *)indexPath
{
   
// 取出当前图片 url 对应的下载操作( operation 对象)
   
NSBlockOperation *operation = self . operations [imageUrl];
   
if (operation) return ;
   
   
// 创建操作,下载图片
   
//    HMAppsViewController * == typeof(self)
   
//    int age = 20;
//    typeof(age) age2 = 10; // int age2 = 10;
//    typeof(100) age3 = 30; // int age3 = 30;
   
   
__weak typeof ( self ) appsVc = self ;
    operation = [
NSBlockOperation blockOperationWithBlock :^{
       
NSURL *url = [ NSURL URLWithString :imageUrl];
       
NSData *data = [ NSData dataWithContentsOfURL :url]; // 下载
       
UIImage *image = [ UIImage imageWithData :data]; // NSData -> UIImage
       
        // 回到主线程
        [[ NSOperationQueue  mainQueue addOperationWithBlock :^{
           
// 存放图片到字典中
           
if (image) {
                appsVc.
images [imageUrl] = image;
            }
           
           
// 从字典中移除下载操作 ( 防止 operations 越来越大,保证下载失败后,能重新下载 )
            [appsVc.
operations removeObjectForKey :imageUrl];
           
           
// 刷新表格
            [appsVc.
tableView reloadRowsAtIndexPaths : @[ indexPath ] withRowAnimation : UITableViewRowAnimationNone ];
        }];
    }];
   
   
// 添加操作到队列中
    [
self . queue addOperation :operation];
   
   
// 添加到字典中 ( 这句代码为了解决重复下载 )
   
self . operations [imageUrl] = operation;
}


/**
 * 
当用户开始拖拽表格时调用
 */

- (
void )scrollViewWillBeginDragging:( UIScrollView *)scrollView
{
   
// 暂停下载
    [
self . queue setSuspended : YES ];
}

/**
 * 
当用户停止拖拽表格时调用
 */

- (
void )scrollViewDidEndDragging:( UIScrollView *)scrollView willDecelerate:( BOOL )decelerate
{
   
// 恢复下载
    [
self . queue setSuspended : NO ];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值