SDWebImage框架学习

  • 内部结构

    • SDWebImageManager
      • SDWebImageCache
      • SDWebImageDownloader
        • SDWebImageManagerDownloadOperation
  • 框架的使用

    • UIImageView+WebCache分类
      • 简单下载图片

           /*
             第一个参数:图片的url
            第二个参数:占位图片
            缓存处理:内存缓存+磁盘缓存
            - (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder
           */
         
        
      • 得到图片的下载进度

            /*
              第一个参数:图片的url
              第二个参数:占位图片
              第三个参数:下载图片的选项(策略)
              第四个参数:progress进度回调
              eceivedSize:已经下载的图片大小
              expectedSize:图片的总大小
              第五个参数:completed 下载完成(成功|失败)之后的回调
               image:要下载的图片,如果错误的话,那么image = nil
              error:错误信息,如果错误的话 那么这个error有值
              cacheType:缓存的类型
                  SDImageCacheTypeNone:没有使用缓存,图片是直接下载的
                  SDImageCacheTypeDisk:磁盘缓存
                  SDImageCacheTypeMemory:内存缓存
              imageURL:图片的url
              缓存处理:内存缓存+磁盘缓存
             -  (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock
            */
        
    • SDWebImageManager类
      • 只是想简单的得到一张图片
        /*
                第一个参数:图片的url
                第二个参数:下载图片的选项(策略)
                第三个参数:progress进度回调
                   receivedSize:已经下载的图片大小
                   expectedSize:图片的总大小
                第四个参数:completed 下载完成(成功|失败)之后的回调
                   image:要下载的图片,如果错误的话,那么image = nil
                   error:错误信息,如果错误的话 那么这个error有值
                   cacheType:缓存的类型
                       SDImageCacheTypeNone:没有使用缓存,图片是直接下载的
                       SDImageCacheTypeDisk:磁盘缓存
                       SDImageCacheTypeMemory:内存缓存
                   imageURL:图片的url
               缓存处理:内存缓存+磁盘缓存
               -(id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url
                                       options:(SDWebImageOptions)options
                                      progress:(SDWebImageDownloaderProgressBlock)progressBlock
                                     completed:(SDWebImageCompletionWithFinishedBlock)completedBlock
              */
      
    • UIImage+GIF分类
      • 播放本地的gif
      // 使用UIImage的类方法
      +(UIImage *)sd_animatedGIFNamed:(NSString *)name
      /*
      内部原理:
      1>把用户传入的gif图片转换为二进制数据流NSData
      2>调用系统<ImageIO/ImageIO.h>的+(UIImage *)sd_animatedGIFWithData:(NSData *)data方法
      2.1>系统方法根据NSData创建一个图片数据源
      2.2>计算数据源中一共有多少帧,把每一帧数据取出放到图片数组中
      2.3>根据得到的数组和计算好的动画时间得到动画,核心代码:animatedImage = [UIImage animatedImageWithImages:images duration:duration];
      */
      
    • SDWebImageDownloader类和UIImage+GIF分类
      • 下载一张gif
      // 1. 创建SDWebImageDownloader的单例对象
      +(SDWebImageDownloader *)sharedDownloader
      // 2. SDWebImageDownloader单例对象调用下面方法下载gif
      /*
      第一个参数:图片的url
      第二个参数:下载图片的选项(策略)
      第三个参数:progress进度回调
        receivedSize:已经下载的图片大小
        expectedSize:图片的总大小
      第四个参数:completed 下载完成(成功|失败)之后的回调
        image:要下载的图片,如果错误的话,那么image = nil
        error:错误信息,如果错误的话 那么这个error有值
        cacheType:缓存的类型
        SDImageCacheTypeNone:没有使用缓存,图片是直接下载的
        SDImageCacheTypeDisk:磁盘缓存
        SDImageCacheTypeMemory:内存缓存
        imageURL:图片的url
        缓存处理:不做缓存处理
        注意点:completed回调是在子线程处理的,所以必须进行线程间的通信返回到主线程
      -(id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url options:(SDWebImageDownloaderOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageDownloaderCompletedBlock)completedBlock
      */
      // 3. 在completed中调用下面方法显示gif图片
      +(UIImage *)sd_animatedGIFWithData:(NSData *)data
      
    • 处理接收到的系统的内存警告(面试)
      • 采用监听系统警告通知的方式处理,接收到警告后清空缓存
      • 代码实现
      -(void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
      //1.清空缓存
      [[SDWebImageManager sharedManager].imageCache clearDisk];
      [[SDWebImageManager sharedManager].imageCache cleanDisk];
      //2.取消当前的下载操作
      [[SDWebImageManager sharedManager] cancelAll];}
      
    • clean和clear的区别(面试)
      • clean:删除过期缓存(苹果官方规定最长的缓存周期是1周),计算当前缓存文件的总大小,比较设置的最大缓存,如果超出的话,那么就继续删除(按照缓存文件创建的顺序),直到小于最大缓存为止
      • clear:简单粗暴 ,直接删除然后重新创建
    • 使用注意事项
      • 判断图片类型
        • + (NSString *)sd_contentTypeForImageData:(NSData *)data
        • 只判断图片二进制数据的第一个字节
      • 队列里面任务的执行方式:先进先出
      • 队列最大并发数是6
      • 图片下载操作使用了NSURLConnection类发送网络请求实现
      • 下载图片的请求超时时间:15s
      • 缓存文件的命名的方式:使用URL字符串进行MD5加密
      • 接受到内存警告之后,内部的处理方式:监听通知,删除内存缓存
      • 内存缓存的处理方式:NSCache
  • NSCache

    • NSCache是专门用来进行缓存处理的,
    • NSCache简单介绍:
      • NSCache是苹果官方提供的缓存类,具体使用和NSMutableDictionary类似,在AFN和SDWebImage框架中被使用来管理缓存
      • 苹果官方解释NSCache在系统内存很低时,会自动释放对象(但模拟器演示不会释放)
        建议:接收到内存警告时主动调用removeAllObject方法释放对象
      • NSCache是线程安全的,在多线程操作中,不需要对NSCache加锁
      • NSCache的Key只是对对象进行Strong引用,不是拷贝
    • 属性介绍:
      • name:名称
      • delegete:设置代理
      • totalCostLimit:缓存空间的最大总成本,超出上限会自动回收对象。默认值为0,表示没有限制
      • countLimit:能够缓存的对象的最大数量。默认值为0,表示没有限制
      • evictsObjectsWithDiscardedContent:标识缓存是否回收废弃的内容
    • 方法介绍
      • -(void)setObject:(ObjectType)obj forKey:(KeyType)key;//在缓存中设置指定键名对应的值,0成本
      • -(void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g;//在缓存中设置指定键名对应的值,并且指定该键值对的成本,用于计算记录在缓存中的所有对象的总成本,出现内存警告或者超出缓存总成本上限的时候,缓存会开启一个回收过程,删除部分元素
      • -(void)removeObjectForKey:(KeyType)key;//删除缓存中指定键名的对象
      • -(void)removeAllObjects;//删除缓存中所有的对象
  • 位移枚举

    • 实现一个参数来传递多个参数
    • 如果发现是位移枚举,而且第一个选项不是0,那么你可以默认传0,效率是最高的
    • 定义位移枚举
    typedef NS_OPTIONS(NSInteger, ZQActionType){
            ZQActionTypeTop = 1<<0,
            ZQActionTypeBottom = 1<<1,
            ZQActionTypeLeft = 1<<2,
            ZQActionTypeRight = 1<<3,};
    
    • 位移枚举的应用
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
            [self demo:ZQActionTypeTop|ZQActionTypeBottom|ZQActionTypeLeft|ZQActionTypeRight];}
    -(void)demo:(ZQActionType)type
    {
             NSLog(@"%zd",type);
    
             if(type & ZQActionTypeTop)
                {
                     NSLog(@"向上--%zd",type & ZQActionTypeTop);
                 }
    
              if(type & ZQActionTypeBottom)
                 {
                      NSLog(@"向下--%zd",type & ZQActionTypeBottom);
                  }
    
              if(type & ZQActionTypeLeft)
                  {
                      NSLog(@"向左--%zd",ZQActionTypeLeft);
                   }
    
               if(type & ZQActionTypeRight)
                   {
                       NSLog(@"向右---%zd",ZQActionTypeRight);
                    }
    }
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容