iOS圖片加載策略實現(xiàn)——SDWebImage的基本使用

今天和大家一起來學習一下SDWebImage的基本使用,有疏忽的地方,還望各位不吝賜教。


一、SDWebImage的簡介

之前簡單地實現(xiàn)了iOS圖片加載,可以看到流程很復雜,而且需要注意的地方很多,本篇來介紹一個加載圖片的第三方SDWebImage,將一些基本的使用方式和實現(xiàn)過程也做一個簡單地分析。關于導入SDWebImage我就不做贅述了,小伙伴們自己去添加吧!

二、《iOS圖片加載策略的簡單實現(xiàn)》使用SDWebImage實現(xiàn)

    /* 如果我們采用SDWebImage來進行《iOS圖片加載策略的簡單實現(xiàn)》文章中的設置圖標,你只要下面這幾行代碼。
     * 這個方法是最復雜的,其他的小伙伴們按照這個比照就行了。
     * 第一個參數(shù):下載圖片的url地址
     * 第二個參數(shù):占位圖片
     * 第三個參數(shù):progress 進度回調
         *  receivedSize 已經下載的數(shù)據(jù)大小
         *  expectedSize 要下載的圖片的總大小
     * 第四個參數(shù):completed回調
     * image 要下載的圖片
     *  error 錯誤信息
     *  cacheType 緩存類型
          SDImageCacheTypeNone,   //不使用 SDWebImage 緩存,從網(wǎng)絡下載
          SDImageCacheTypeDisk,   //使用磁盤緩存
          SDImageCacheTypeMemory  //使用內存緩存
     *   imageURL  圖片url
     *
     * 忘記了一個參數(shù):options 使用0表示采用默認方法
        SDWebImageRetryFailed = 1 << 0, //失敗后嘗試重新下載
        SDWebImageLowPriority = 1 << 1, //低優(yōu)先級
        SDWebImageCacheMemoryOnly = 1 << 2, //只使用內存緩存
        SDWebImageProgressiveDownload = 1 << 3, //漸進式下載
        SDWebImageRefreshCached = 1 << 4, //刷新緩存
        SDWebImageContinueInBackground = 1 << 5, //后臺下載
        SDWebImageHandleCookies = 1 << 6, //處理保存在NSHTTPCookieStore中的cookies
        SDWebImageAllowInvalidSSLCertificates = 1 << 7, //允許不信任的 SSL 證書
        SDWebImageHighPriority = 1 << 8,    //高優(yōu)先級(優(yōu)先下載)
        SDWebImageDelayPlaceholder = 1 << 9,    //延遲占位圖片
        SDWebImageTransformAnimatedImage = 1 << 10, //轉換動畫圖像
        SDWebImageAvoidAutoSetImage = 1 << 11   //手動設置圖像
     */
    NSURL *url = [NSURL URLWithString:item.icon];
    [cell.imageView sd_setImageWithPreviousCachedImageWithURL:url placeholderImage:[UIImage imageNamed:@"placeHolder.png"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {

    } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
      // 是使用的哪里的圖片,下載的,內存的還是沙盒的
        NSLog(@"cacheType------%ld",(long)cacheType);

    }];

三、SDWebImage的基本使用

1、下載圖片且需要獲得下載進度 默認內存緩存&磁盤緩存都做了

   [self.iconImageView sd_setImageWithPreviousCachedImageWithURL:[NSURL URLWithString:@" 下載圖片的路徑"]placeholderImage:[UIImage imageNamed:@"icon"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
        
    } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
        switch (cacheType) {
            case SDImageCacheTypeNone:
                NSLog(@"SDImageCacheTypeNone");
                break;
            case SDImageCacheTypeDisk:
                NSLog(@"SDImageCacheTypeDisk");
                break;
            case SDImageCacheTypeMemory:
                NSLog(@"SDImageCacheTypeMemory");
                break;
            default:
                NSLog(@"default");
                break;
        }
    }];

2、簡單獲得一張圖片,不進行一些其他設置

    // 這個是最核心的方法,上面的方法調用的就是這個方法
    [[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:@"下載圖片的路徑"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
        
        NSLog(@"%f",1.0 * receivedSize / expectedSize);
        
    } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
        // finished:如果圖像下載完成則為YES,如果使用
        self.iconImageView.image = image;
        
    }];

3、沒有做任何緩存操作

    // data:圖片的二進制數(shù)據(jù)
    [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:[NSURL URLWithString:@"下載圖片的路徑"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
        
    } completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {
        // 且block是在子線程中執(zhí)行的 要和主線程進行通信
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            
            self.iconImageView.image = [UIImage imageWithData:data];
            
        }];
        
    }];

4、設置gif圖片

self.iconImageView.image = [UIImage sd_animatedGIFNamed:@"gif圖片的下載路徑"];

5、內存清空

// 在AppDelegate中進行操作 因為在很多控制器你可能都用到了,所以在這里做
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application{
    // 1、清空緩存
    // cleanDisk : 清除過期的緩存,計算當前的緩存大小,和設置的最大緩存數(shù)量進行比對,如果依然超過那么繼續(xù)刪除(按照創(chuàng)建時間的先后順序進行刪除)
    // clearDisk : 直接刪除,重新創(chuàng)建
    // 過期時間:7天 在SDWebImageCache文件中可以找到對應的屬性
    //   [[SDWebImageManager sharedManager].imageCache cleanDisk];
    [[SDWebImageManager sharedManager].imageCache clearDisk];
    // 2、取消當前所有的操作
    [[SDWebImageManager sharedManager] cancelAll];
}

四、SDWebImage的內部介紹

    /* 
     * SDWebImageManager 分為兩部分
     * 一部分是用來處理圖片緩存的SDImageCache
     * 還有一部分是處理下載的類SDWebImageDownloader 但是圖片的下載方法真正的實現(xiàn)在其子類中SDWebImageDownloaderOpertion
     * 1、最大并發(fā)數(shù)量
       maxConcurrentDownloads 設置并發(fā)下載數(shù),默認為6
     * 2、緩存文件的保存名稱如何處理 將url進行MD5加密后最為緩存圖片的名稱 下面這個命令可以直接在終端中得到md5加密的圖片路徑
        echo -n "下載圖片的路徑" |md5
     * 3、該框架內部對于內存警告的處理方式
       監(jiān)聽到UIApplicationDidReceiveMemoryWarningNotification(應用程序發(fā)生內存警告)通知后,調用removeAllObjects方法
       通過監(jiān)聽通知的方式進行內存的清理操作。
     * 4、該框架進行緩存處理的方式
          NSCache
     * 5、如何判斷圖片的類型
           NSData+ImageContentType.h 在判斷圖片類型的時候,只匹配第一個字節(jié)就可以判斷
     * 6、隊列中任務的處理方式
          SDWebImageDownloaderExecutionOrder 下載的順序 默認SDWebImageDownloaderFIFOExecutionOrder 先進先出
     * 7、如何下載圖片的?
          發(fā)送請求下載圖片 使用NSURLConnection 當然在iOS7.0之后都改成了NSURLSession
     * 8、請求超時的時間默認是15秒
     */

五、結合NSCache繼續(xù)優(yōu)化

結合NSCache繼續(xù)進行《iOS圖片加載策略的簡單實現(xiàn)》中的實現(xiàn)的優(yōu)化,關于NSCache的使用大家直接去看我的《iOS緩存策略——NSCache的簡單使用》,好吧這篇文章已經跑偏了。說到這里我們就把SDWebImage簡單的描述完了,雖然也沒說到啥,筆者能力有限,關于SDWebImage還會繼續(xù)學習的。

    /** 內存緩存 */
    @property (nonatomic, strong) NSCache *images;
    // 懶加載實現(xiàn)
    - (NSCache *)images{
        if (!_images) {
            _images = [[NSCache alloc] init];
            // 能夠緩存圖片的最大數(shù)量。默認值為0,表示沒有限制。
            _images.countLimit = 4;
        }
    
        return _images;
    }

寫在最后的話:關于SDWebImage的基本使用今天就分享到這里,關于iOS圖片加載策略的問題歡迎大家和我交流,共同進步,謝謝各位。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容