SDWebImage框架学习

作者: JoyceZhao | 来源:发表于2016-01-13 21:48 被阅读2648次
    • 内部结构

      • 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);
                      }
      }
      

    相关文章

      网友评论

      本文标题:SDWebImage框架学习

      本文链接:https://www.haomeiwen.com/subject/gewckttx.html