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 )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>调用系统的+(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 )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 *)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框架学习)