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

来源:互联网 发布:淘宝助理导入不了csv 编辑:程序博客网 时间:2024/06/01 11:39


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

而按照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
原创粉丝点击