关于SDWebImage内存缓存的一点简单理解-King


关于内存缓存,我的理解就是,从网络上下载的图片文件,直到程序被销毁,或者被自己手动销毁前,能够一直存在内存中,而不是被系统自动销毁.

而按照OC的内存管理原则,图片被下载存储在内存中后,我们可以将下载的图片以UIImage的对象形式存储,并且有一个强指针指向它,这样这个Image对象就不会被销毁,只要这个强指针存在,那么这个Image对象就不会被销毁.这里就引出了,我所理解的内存缓存的理解,我的思路是,(注意下面被我刷红的代码)下载的图片数据可以用定义的模型来进行强引用,注意这段( v.image =[UIImage imageWithData:data];)用模型Video中的image指向了这个image,这样下载的图片对象就回一直被引用着,不会被销毁.这样在有些地方需要这张图片时,只要从这个模型中查找就行,在下面的(if (!v.image))这个判断中就是先判断模型中是否有这张图片,如果有就直接调用,如果没有,就调用下载方法,进行下载,并进行缓存.

 

 

// 请注意一下刷红的代码,这段代码是IOS9之前的代码,有些方法被废弃了,但是不影响我要表达的内容

 

这个是模型数据

@interface Video :NSObject

@property(nonatomic, strong) UIImage *image;

//这里还有其它的属性定义,省略;

@end

 

 

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

{

    //1.创建cell

    static NSString*ID = @"CELL";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

    

   // 2.设置cell的数据

    Video *v = self.videoList[indexPath.row];

     // 如果没有图像

    if (!v.image) {

       cell.imageView.image = [UIImageimageNamed:@"user_default"];

       

     //需要去网络上加载

       [self loadUserImage:indexPath];

   } else {

       cell.imageView.image = v.image;

   }

    

    return cell;

}

 

 

//内存缓存,再次启动需要重复加载!

- (void)loadUserImage:(NSIndexPath*)indexPath

{

    Video *v = self.videoList[indexPath.row];

    NSString *urlStr = [NSStringstringWithFormat:@"%@%@",kBaseURL, v.imageURL];

   NSURLRequest *request =[NSURLRequestrequestWithURL:[NSURLURLWithString:urlStr]cachePolicy:0timeoutInterval:2.0f];

    //发送网络连接

    [NSURLConnectionsendAsynchronousRequest:requestqueue:[[NSOperationQueuealloc]init]completionHandler:^(NSURLResponse*response,NSData *data, NSError *connectionError) {       

        [NSThreadsleepForTimeInterval:1.0f];      

        // data转换成image

       v.image = [UIImage imageWithData:data];

 

        dispatch_async(dispatch_get_main_queue(), ^{

           //要刷新表格,局部刷新即可

            [self.tableViewreloadRowsAtIndexPaths:@[indexPath]withRowAnimation:UITableViewRowAnimationNone];

       });

    }];

}

 

 

 

写在这里,以上也许还有很多我理解不到位的地方,如果你们找到我理解上不对的地方和错误还请指教,共同进步.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值