有关 SDWebImage 框架的一些细节
2017-02-09 本文已影响287人
Senjougahara
1. Q:SDWebImage 下载图片的最大并发数量为多少?
A:6
- 在
SDWebImageDownloader.m
文件中的init
方法的下面一行代码给了答案
_downloadQueue.maxConcurrentOperationCount = 6;
2. Q:SDWebImage 下载队列的处理方式?
A:FIFO 的队列处理方式(先进先出)
- 同样也是在
init
方法中
_executionOrder = SDWebImageDownloaderFIFOExecutionOrder;
3. Q:SDWebImage 框架中的缓存文件名字是如何命名的?
A:通过图片的 URL 地址,将地址进行MD5加密,然后将加密得到的一串字符作为图片的名字。
4. Q:SDWebImage 框架内部是如何处理内存警告的?
A:通过监听通知的方式清理缓存
- 在
SDWebImageCache.m
文件中的- dealloc
方法注册一个通知中心
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
}
当这个通知接受到内存警告时会直接removeAllObjects
5. Q:SDWebImage 框架是如何判断图片类型的(GIF or PNG…)?
A:匹配图片的第一个字节的二进制码,然后进行图片类型判断
- 在
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;
}
先将下载的图片解码,然后匹配该图片第一个字节的二进制码,最后return
该图片的类型
6. Q:SDWebImage 框架是如何下载图片的?
A:发送网络请求下载图片,主要是使用NSURLSession
- 在
SDWebImageDownloaderOperation.m
文件中的- start
方法创建了一个NSURLSession
对象
self.ownedSession = [NSURLSession sessionWithConfiguration:sessionConfig
delegate:self
delegateQueue:nil];
下载图片主要是通过下面的一个代理方法(NSURLSessionDataDelegate)实现的,创建一个NSMutableData
的对象将服务器请求到的数据一点一点拼接起来
self.imageData = [[NSMutableData alloc] initWithCapacity:expected];
self.response = response;