
1. Q:SDWebImage 下載圖片的最大并發(fā)數(shù)量為多少?
A:6
- 在
SDWebImageDownloader.m文件中的init方法的下面一行代碼給了答案
_downloadQueue.maxConcurrentOperationCount = 6;
2. Q:SDWebImage 下載隊(duì)列的處理方式?
A:FIFO 的隊(duì)列處理方式(先進(jìn)先出)
- 同樣也是在
init方法中
_executionOrder = SDWebImageDownloaderFIFOExecutionOrder;
3. Q:SDWebImage 框架中的緩存文件名字是如何命名的?
A:通過(guò)圖片的 URL 地址,將地址進(jìn)行MD5加密,然后將加密得到的一串字符作為圖片的名字。
4. Q:SDWebImage 框架內(nèi)部是如何處理內(nèi)存警告的?
A:通過(guò)監(jiān)聽(tīng)通知的方式清理緩存
- 在
SDWebImageCache.m文件中的- dealloc方法注冊(cè)一個(gè)通知中心
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
}
當(dāng)這個(gè)通知接受到內(nèi)存警告時(shí)會(huì)直接removeAllObjects
5. Q:SDWebImage 框架是如何判斷圖片類型的(GIF or PNG…)?
A:匹配圖片的第一個(gè)字節(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;
}
先將下載的圖片解碼,然后匹配該圖片第一個(gè)字節(jié)的二進(jìn)制碼,最后return該圖片的類型
6. Q:SDWebImage 框架是如何下載圖片的?
A:發(fā)送網(wǎng)絡(luò)請(qǐng)求下載圖片,主要是使用NSURLSession
- 在
SDWebImageDownloaderOperation.m文件中的- start方法創(chuàng)建了一個(gè)NSURLSession對(duì)象
self.ownedSession = [NSURLSession sessionWithConfiguration:sessionConfig
delegate:self
delegateQueue:nil];
下載圖片主要是通過(guò)下面的一個(gè)代理方法(NSURLSessionDataDelegate)實(shí)現(xiàn)的,創(chuàng)建一個(gè)NSMutableData的對(duì)象將服務(wù)器請(qǐng)求到的數(shù)據(jù)一點(diǎn)一點(diǎn)拼接起來(lái)
self.imageData = [[NSMutableData alloc] initWithCapacity:expected];
self.response = response;