第三方应用iOS 三方库·自定义控件·源码解析自己尝试等装一下

4.SDWebImage的应用(常用)

2016-08-31  本文已影响212人  IIronMan

重要的3个类

 #import "SDWebImageManager.h"//在内存警告appdelegate.m里面使用
  
 #import "UIImageView+WebCache.h"在处理图片的时候使用
 
 #import " SDImageCache.h "//可以查看缓存的时间和最大的内存缓存

1.简述讲解的内容

<1>什么是SDWebImage?
<2>iOS中著名的牛逼的网络图片处理框架
<3>包含的功能:图片的下载,图片的缓存(什么缓存都有,还可以设定多久缓存的图片清理),下载的进度监听(可以处理大图片的下载进度),gif处理(动态图的处理播放,用ImageIO抽出来gif里面的每一帧来处理gif图片播放)等等
<4>用法极其简单,功能十分强大,大大提高了图片的处理效率
<5>国内超过90%的iOS项目都有它的影子

一个项目的地址
题外话: SDWebImage也是继承于imageIO 专门用于处理Gif图片

2.使用它之前先导入

 导入#import "UIImageView+WebCache.h"

3.SDWebImage对各种方法的使用

1.图片的下载展示以及无网路替换图片
- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder;
要的是图片的连接和无网络的情况下替换图片
操作的对象是 UIImageView的对象,在没有网络的情况下图片也会显示出来,是应为SDWebImage它会把图片缓存一周
2.进行图片的下载和展示(操作对象都是UIImageView)

- (void)sd_setImageWithURL:(NSURL *)url;仅仅加载图片的连接

3.完成图片的展示和下载后再做其他的事情 completed(图片加载完毕)

 [imageView sd_setImageWithURL:(NSURL *) placeholderImage:(UIImage *) completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
    
       在图片**加载完毕**这里可以做一些其他的事情(有可能从沙盒里面获取)
  }];

4.带有下载的参数,一般是前两种参数混合使用

NSURL *url = [NSURL URLWithString:array[indexPath.row]];

UIImage *placeholder = [UIImage imageNamed:@"haha"];

//options 下载的一些参数

//SDWebImageOptions (前两个混合使用价值比较高,其他的特殊情况下使用)
   /*
    1.SDWebImageRetryFailed  下载失败再次下载
    2.SDWebImageLowPriority  在UI交互情况下停止下载,UIScrollView减速时延迟下载
    3.SDWebImageCacheMemoryOnly 缓存在内存里面,下次进来就没有了,一般不用
    4.SDWebImageProgressiveDownload 图片从上往下刷出来
    5.SDWebImageRefreshCached 刷新缓存
   */

SDWebImageOptions options = SDWebImageRetryFailed | SDWebImageLowPriority;

[cell.picture sd_setImageWithURL:url placeholderImage:placeholder options:options progress:^(NSInteger receivedSize, NSInteger expectedSize) {
    
    //这里每下载一段就会被调用(可能会频繁的调用):具体的根据图片的大小来计算
    //receivedSize 接收到多少个字节
    //expectedSize 期望的字节(总的字节)
    
    NSLog(@"下载进度==%f",1.0*receivedSize/expectedSize);//或者(double)*receivedSize/expectedSize
    
    
    //这里是图片下载的进度
    
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
    
    //图片加载完毕(可能是从沙盒里面加载,也可能从服务器加载):只调用一次
}];

第一次会走下载进度那里,之后不再走,直接从沙盒获取,加载完成


在第一次下载会走瞎子进度那里

5.下面我们来讲解一下有关图片在沙盒里面内存较大的情况的下的内存报警的处理办法,在appdelegate.m里面进行 处理

在appdelegate里面导入#import "SDWebImageManager.h"
/*
当我们的整个程序接收到内存警告
*/

-(void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
SDWebImageManager *manger = [SDWebImageManager sharedManager];

//1.取消下载的操作

[manger cancelAll];

//2.清楚内存的缓存,沙盒不用清,沙盒和内存没关系
/*
[manger.imageCache clearDisk];//清除沙盒,东西会全部没有了,下次还要下载

[manger.imageCache cleanDisk];//清楚沙盒过期的缓存
 */

//在此我们只需要清楚内存呢警告就好了

[manger.imageCache clearMemory];//清除内存警告

 }

<1>图片默认缓存的时间是 1个星期,以秒为单位

如:manger.imageCache.maxCacheAge = 100 * 60 *60;//缓存100天
默认一个星期

<2>缓存最多(最大的缓存量)可以装多少东西,比如说我设置8M,超过之后会清理以前的东西来放新的东西,在此没有默认缓存多大,单位是bytes字节


最大的缓存大小

简单的运用 密码: bj5j

最后:下面是我对cell上图片的缓存

/**
 *  1.内存缓存图片
 */

@property(nonatomic,strong) NSMutableDictionary *dataDictionary;

NSString *stringImage = [NSString stringWithFormat:@"%@",self.plist[indexPath.row]];

//先从内存缓存中取出图片
UIImage *image = self.dataDictionary[stringImage];

if (image) {//内存有图片
    
     cell.imageCellPicture.image = image;
    
}else{// 内存中没有图片

dispatch_async(dispatch_get_global_queue(0, 0), ^{
 
    //获取Library/Caches 文件夹
    NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
    //获取文件名(也就是取得路径的最后一个路径)
    NSString *fileName = [stringImage lastPathComponent];
    //计算出全路径
    NSString *filePath = [cachesPath stringByAppendingPathComponent:fileName];
    //取出图片
    NSData *data = [NSData dataWithContentsOfFile:filePath];
    
    if(data){//直接利用沙盒中图片
        
        dispatch_async(dispatch_get_main_queue(), ^{
            
            cell.imageCellPicture.image = [UIImage imageWithData:data];
            
        });
         //存到字典中
        self.dataDictionary[stringImage] = cell.imageCellPicture.image;
        
    }else
    {   // 下载图片
        data = [NSData dataWithContentsOfURL:[NSURL URLWithString:stringImage]];
        
        UIImage *image1 = [UIImage imageWithData:data];
        
        dispatch_async(dispatch_get_main_queue(), ^{
            
            cell.imageCellPicture.image = image1;
        });
        
        // 存到字典中
        self.dataDictionary[stringImage] = cell.imageCellPicture.image;
        // 将图片文件数据写入沙盒中
        [data writeToFile:filePath atomically:YES];
    }
});

图片缓存代码 密码: wjhv

有沙盒的缓存

完善的图片缓存 密码: gr3k

上一篇下一篇

猜你喜欢

热点阅读