關於SDWebImage

1 .SDWebImage的緩存策略

SDWebImage 的圖片緩存默認情況採用的是 Memory 和 Disk 雙重緩存機制。下載之前先去Memory中查找圖片數據,找到直接返回使用;找不到再到Disk中查找圖片數據,找到後放入Memory中再返回使用;如果Disk中也找不到再去下載圖片;下載到圖片後顯示圖片並將圖片數據存到Memory和Disk中。
​​​

2. SDWebImage 緩存圖片命名規則?

爲了防止名稱重複,對其進行 md5 運算

3.默認下載時長和默認緩存時長?

_maxCacheAge = kDefaultCacheMaxCacheAge;

static const NSInteger kDefaultCacheMaxCacheAge = 60 60 24 * 7; // 1 week

//下載時長
 15秒

4.磁盤清理時間點?

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(deleteOldFiles)
                                             name:UIApplicationWillTerminateNotification
                                           object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(backgroundDeleteOldFiles)
                                             name:UIApplicationDidEnterBackgroundNotification
                                           object:nil];
分別在『應用被殺死時』和 『應用進入後臺時』進行清理操作

5. SDWebImage的最大併發數是多少?

_downloadQueue.maxConcurrentOperationCount = 6

6.SDWebImage防止同一個url多次加載?

SDWebImageDownloader中有一個可變字典屬性。

@property (strong, nonatomic) NSMutableDictionary *URLCallbacks;

通過下面的代碼我們可以看出來字典中key是圖片的url,value是一個可變數組,數組裏面是一個一個的字典,每個字典中保存了下載過程回調和完成回調。每個字典相當於一次下載請求,但是隻有第一次的下載請求才會真正去執行下載操作。這樣就防止同一個url多次加載。

- (void)addProgressCallback:(SDWebImageDownloaderProgressBlock)progressBlock completedBlock:(SDWebImageDownloaderCompletedBlock)completedBlock forURL:(NSURL *)url createCallback:(SDWebImageNoParamsBlock)createCallback {
    // The URL will be used as the key to the callbacks dictionary so it cannot be nil. If it is nil immediately call the completed block with no image or data.
    if (url == nil) {
        if (completedBlock != nil) {
            completedBlock(nil, nil, nil, NO);
        }
        return;
    }
    dispatch_barrier_sync(self.barrierQueue, ^{
        BOOL first = NO;
        if (!self.URLCallbacks[url]) {
            self.URLCallbacks[url] = [NSMutableArray new];
            first = YES;
        }
        // Handle single download of simultaneous download request for the same URL
        NSMutableArray *callbacksForURL = self.URLCallbacks[url];
        NSMutableDictionary *callbacks = [NSMutableDictionary new];
        if (progressBlock) callbacks[kProgressCallbackKey] = [progressBlock copy];
        if (completedBlock) callbacks[kCompletedCallbackKey] = [completedBlock copy];
        [callbacksForURL addObject:callbacks];
        self.URLCallbacks[url] = callbacksForURL;
        //執行下載操作
        if (first) {
            createCallback();
        }
    });
}

在圖片下載完成或者取消下載,根據url將URLCallbacks中的數組移除。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章