有关 SDWebImage 框架的一些细节

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;

你可能感兴趣的:(有关 SDWebImage 框架的一些细节)