SDWebImage框架學(xué)習(xí)

  • 內(nèi)部結(jié)構(gòu)

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

    • UIImageView+WebCache分類
      • 簡(jiǎn)單下載圖片

           /*
             第一個(gè)參數(shù):圖片的url
            第二個(gè)參數(shù):占位圖片
            緩存處理:內(nèi)存緩存+磁盤緩存
            - (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder
           */
         
        
      • 得到圖片的下載進(jìn)度

            /*
              第一個(gè)參數(shù):圖片的url
              第二個(gè)參數(shù):占位圖片
              第三個(gè)參數(shù):下載圖片的選項(xiàng)(策略)
              第四個(gè)參數(shù):progress進(jìn)度回調(diào)
              eceivedSize:已經(jīng)下載的圖片大小
              expectedSize:圖片的總大小
              第五個(gè)參數(shù):completed 下載完成(成功|失敗)之后的回調(diào)
               image:要下載的圖片,如果錯(cuò)誤的話,那么image = nil
              error:錯(cuò)誤信息,如果錯(cuò)誤的話 那么這個(gè)error有值
              cacheType:緩存的類型
                  SDImageCacheTypeNone:沒有使用緩存,圖片是直接下載的
                  SDImageCacheTypeDisk:磁盤緩存
                  SDImageCacheTypeMemory:內(nèi)存緩存
              imageURL:圖片的url
              緩存處理:內(nèi)存緩存+磁盤緩存
             -  (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock
            */
        
    • SDWebImageManager類
      • 只是想簡(jiǎn)單的得到一張圖片
        /*
                第一個(gè)參數(shù):圖片的url
                第二個(gè)參數(shù):下載圖片的選項(xiàng)(策略)
                第三個(gè)參數(shù):progress進(jìn)度回調(diào)
                   receivedSize:已經(jīng)下載的圖片大小
                   expectedSize:圖片的總大小
                第四個(gè)參數(shù):completed 下載完成(成功|失敗)之后的回調(diào)
                   image:要下載的圖片,如果錯(cuò)誤的話,那么image = nil
                   error:錯(cuò)誤信息,如果錯(cuò)誤的話 那么這個(gè)error有值
                   cacheType:緩存的類型
                       SDImageCacheTypeNone:沒有使用緩存,圖片是直接下載的
                       SDImageCacheTypeDisk:磁盤緩存
                       SDImageCacheTypeMemory:內(nèi)存緩存
                   imageURL:圖片的url
               緩存處理:內(nèi)存緩存+磁盤緩存
               -(id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url
                                       options:(SDWebImageOptions)options
                                      progress:(SDWebImageDownloaderProgressBlock)progressBlock
                                     completed:(SDWebImageCompletionWithFinishedBlock)completedBlock
              */
      
    • UIImage+GIF分類
      • 播放本地的gif
      // 使用UIImage的類方法
      +(UIImage *)sd_animatedGIFNamed:(NSString *)name
      /*
      內(nèi)部原理:
      1>把用戶傳入的gif圖片轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)流NSData
      2>調(diào)用系統(tǒng)<ImageIO/ImageIO.h>的+(UIImage *)sd_animatedGIFWithData:(NSData *)data方法
      2.1>系統(tǒng)方法根據(jù)NSData創(chuàng)建一個(gè)圖片數(shù)據(jù)源
      2.2>計(jì)算數(shù)據(jù)源中一共有多少幀,把每一幀數(shù)據(jù)取出放到圖片數(shù)組中
      2.3>根據(jù)得到的數(shù)組和計(jì)算好的動(dòng)畫時(shí)間得到動(dòng)畫,核心代碼:animatedImage = [UIImage animatedImageWithImages:images duration:duration];
      */
      
    • SDWebImageDownloader類和UIImage+GIF分類
      • 下載一張gif
      // 1. 創(chuàng)建SDWebImageDownloader的單例對(duì)象
      +(SDWebImageDownloader *)sharedDownloader
      // 2. SDWebImageDownloader單例對(duì)象調(diào)用下面方法下載gif
      /*
      第一個(gè)參數(shù):圖片的url
      第二個(gè)參數(shù):下載圖片的選項(xiàng)(策略)
      第三個(gè)參數(shù):progress進(jìn)度回調(diào)
        receivedSize:已經(jīng)下載的圖片大小
        expectedSize:圖片的總大小
      第四個(gè)參數(shù):completed 下載完成(成功|失敗)之后的回調(diào)
        image:要下載的圖片,如果錯(cuò)誤的話,那么image = nil
        error:錯(cuò)誤信息,如果錯(cuò)誤的話 那么這個(gè)error有值
        cacheType:緩存的類型
        SDImageCacheTypeNone:沒有使用緩存,圖片是直接下載的
        SDImageCacheTypeDisk:磁盤緩存
        SDImageCacheTypeMemory:內(nèi)存緩存
        imageURL:圖片的url
        緩存處理:不做緩存處理
        注意點(diǎn):completed回調(diào)是在子線程處理的,所以必須進(jìn)行線程間的通信返回到主線程
      -(id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url options:(SDWebImageDownloaderOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageDownloaderCompletedBlock)completedBlock
      */
      // 3. 在completed中調(diào)用下面方法顯示gif圖片
      +(UIImage *)sd_animatedGIFWithData:(NSData *)data
      
    • 處理接收到的系統(tǒng)的內(nèi)存警告(面試)
      • 采用監(jiān)聽系統(tǒng)警告通知的方式處理,接收到警告后清空緩存
      • 代碼實(shí)現(xiàn)
      -(void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
      //1.清空緩存
      [[SDWebImageManager sharedManager].imageCache clearDisk];
      [[SDWebImageManager sharedManager].imageCache cleanDisk];
      //2.取消當(dāng)前的下載操作
      [[SDWebImageManager sharedManager] cancelAll];}
      
    • clean和clear的區(qū)別(面試)
      • clean:刪除過(guò)期緩存(蘋果官方規(guī)定最長(zhǎng)的緩存周期是1周),計(jì)算當(dāng)前緩存文件的總大小,比較設(shè)置的最大緩存,如果超出的話,那么就繼續(xù)刪除(按照緩存文件創(chuàng)建的順序),直到小于最大緩存為止
      • clear:簡(jiǎn)單粗暴 ,直接刪除然后重新創(chuàng)建
    • 使用注意事項(xiàng)
      • 判斷圖片類型
        • + (NSString *)sd_contentTypeForImageData:(NSData *)data
        • 只判斷圖片二進(jìn)制數(shù)據(jù)的第一個(gè)字節(jié)
      • 隊(duì)列里面任務(wù)的執(zhí)行方式:先進(jìn)先出
      • 隊(duì)列最大并發(fā)數(shù)是6
      • 圖片下載操作使用了NSURLConnection類發(fā)送網(wǎng)絡(luò)請(qǐng)求實(shí)現(xiàn)
      • 下載圖片的請(qǐng)求超時(shí)時(shí)間:15s
      • 緩存文件的命名的方式:使用URL字符串進(jìn)行MD5加密
      • 接受到內(nèi)存警告之后,內(nèi)部的處理方式:監(jiān)聽通知,刪除內(nèi)存緩存
      • 內(nèi)存緩存的處理方式:NSCache
  • NSCache

    • NSCache是專門用來(lái)進(jìn)行緩存處理的,
    • NSCache簡(jiǎn)單介紹:
      • NSCache是蘋果官方提供的緩存類,具體使用和NSMutableDictionary類似,在AFN和SDWebImage框架中被使用來(lái)管理緩存
      • 蘋果官方解釋NSCache在系統(tǒng)內(nèi)存很低時(shí),會(huì)自動(dòng)釋放對(duì)象(但模擬器演示不會(huì)釋放)
        建議:接收到內(nèi)存警告時(shí)主動(dòng)調(diào)用removeAllObject方法釋放對(duì)象
      • NSCache是線程安全的,在多線程操作中,不需要對(duì)NSCache加鎖
      • NSCache的Key只是對(duì)對(duì)象進(jìn)行Strong引用,不是拷貝
    • 屬性介紹:
      • name:名稱
      • delegete:設(shè)置代理
      • totalCostLimit:緩存空間的最大總成本,超出上限會(huì)自動(dòng)回收對(duì)象。默認(rèn)值為0,表示沒有限制
      • countLimit:能夠緩存的對(duì)象的最大數(shù)量。默認(rèn)值為0,表示沒有限制
      • evictsObjectsWithDiscardedContent:標(biāo)識(shí)緩存是否回收廢棄的內(nèi)容
    • 方法介紹
      • -(void)setObject:(ObjectType)obj forKey:(KeyType)key;//在緩存中設(shè)置指定鍵名對(duì)應(yīng)的值,0成本
      • -(void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g;//在緩存中設(shè)置指定鍵名對(duì)應(yīng)的值,并且指定該鍵值對(duì)的成本,用于計(jì)算記錄在緩存中的所有對(duì)象的總成本,出現(xiàn)內(nèi)存警告或者超出緩存總成本上限的時(shí)候,緩存會(huì)開啟一個(gè)回收過(guò)程,刪除部分元素
      • -(void)removeObjectForKey:(KeyType)key;//刪除緩存中指定鍵名的對(duì)象
      • -(void)removeAllObjects;//刪除緩存中所有的對(duì)象
  • 位移枚舉

    • 實(shí)現(xiàn)一個(gè)參數(shù)來(lái)傳遞多個(gè)參數(shù)
    • 如果發(fā)現(xiàn)是位移枚舉,而且第一個(gè)選項(xiàng)不是0,那么你可以默認(rèn)傳0,效率是最高的
    • 定義位移枚舉
    typedef NS_OPTIONS(NSInteger, ZQActionType){
            ZQActionTypeTop = 1<<0,
            ZQActionTypeBottom = 1<<1,
            ZQActionTypeLeft = 1<<2,
            ZQActionTypeRight = 1<<3,};
    
    • 位移枚舉的應(yīng)用
    -(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);
                    }
    }
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容