1. Q:SDWebImage 下載圖片的最大并發(fā)數(shù)量為多少旨指?
A:6
- 在
SDWebImageDownloader.m
文件中的init
方法的下面一行代碼給了答案
_downloadQueue.maxConcurrentOperationCount = 6;
2. Q:SDWebImage 下載隊列的處理方式?
A:FIFO 的隊列處理方式(先進(jìn)先出)
- 同樣也是在
init
方法中
_executionOrder = SDWebImageDownloaderFIFOExecutionOrder;
3. Q:SDWebImage 框架中的緩存文件名字是如何命名的?
A:通過圖片的 URL 地址癣猾,將地址進(jìn)行MD5加密蚕礼,然后將加密得到的一串字符作為圖片的名字。
4. Q:SDWebImage 框架內(nèi)部是如何處理內(nèi)存警告的色洞?
A:通過監(jiān)聽通知的方式清理緩存
- 在
SDWebImageCache.m
文件中的- dealloc
方法注冊一個通知中心
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
}
當(dāng)這個通知接受到內(nèi)存警告時會直接removeAllObjects
5. Q:SDWebImage 框架是如何判斷圖片類型的(GIF or PNG…)替蛉?
A:匹配圖片的第一個字節(jié)的二進(jìn)制碼贯溅,然后進(jìn)行圖片類型判斷
- 在
NSData+ImageContentType.m
文件中
[data getBytes:&c length:1];
switch (c) {
case 0xFF:
return @"image/jpeg";
case 0x89:
return @"image/png";
case 0x47:
return @"image/gif";
case 0x49:
case 0x4D:
return @"image/tiff";
case 0x52:
// R as RIFF for WEBP
if ([data length] < 12) {
return nil;
}
先將下載的圖片解碼,然后匹配該圖片第一個字節(jié)的二進(jìn)制碼躲查,最后return
該圖片的類型
6. Q:SDWebImage 框架是如何下載圖片的它浅?
A:發(fā)送網(wǎng)絡(luò)請求下載圖片,主要是使用NSURLSession
- 在
SDWebImageDownloaderOperation.m
文件中的- start
方法創(chuàng)建了一個NSURLSession
對象
self.ownedSession = [NSURLSession sessionWithConfiguration:sessionConfig
delegate:self
delegateQueue:nil];
下載圖片主要是通過下面的一個代理方法(NSURLSessionDataDelegate)實現(xiàn)的镣煮,創(chuàng)建一個NSMutableData
的對象將服務(wù)器請求到的數(shù)據(jù)一點一點拼接起來
self.imageData = [[NSMutableData alloc] initWithCapacity:expected];
self.response = response;