一、SDWebImage的常见面试题

1.SDWebImage的最大并发数是多少,为什么有最大并发数,先回忆,最大并发数这个属性是谁的,是操作队列的,所以SDWebImage它里边,是不是用到队列了,是不是要找到这个队列在哪儿,队列在哪儿,我告诉大家这么一个文件,在SDWebImageDownloader.m中的init方法,_downloadQueue.maxConcurrentOperationCount = 6,我们找到SDWebImageDownloader.m,我们看,这儿有什么,

NSOperationQueue,队列,起的名字叫做downloadQueue,就是下载队列,好,我们找,这个属性,要去初始化,初始化的话,只能在init之类的方法中,来初始化,往下看,

init的时候,要找到downloadQueue的初始化,就是这句,
_downloadQueue = [NSOperatioinQueue new];
这个位置,设置最大并发数,等于多少,
_downloadQueue.maxConcurrentOperationCount = 6;
最大并发数,等于6,所以,SDWebImage队列中最大的并发数是6,

2.SDWebImage支持gif吗,支持,刚刚演示过,只是最新的那个版本中有问题,老版本是没有问题的,是可以支持GIF的,它是支持GIF的,并且有一个分类,是支持的,怎么去实现的,我们也看过了,
3.SDWebImage中怎么判断文件的类型的,
SDWebImage,它不光支持GIF,还支持JPG,还支持PNG,还支持我们不常用的一种格式,WEBP,一种图片格式,既然它支持这多种图片格式,那SDWebImage里边,肯定要想办法去判断出来,这些文件的格式,每种文件要做不同的处理的,尤其是GIF,要做不同的处理的,它是怎么去识别出来,这些文件格式的,来看,有一个类,有一个分类,NSData+ImageContentType,

NSData+ImageContentType:这块儿有一个分类,NSData是二进制数据,二进制数据,我们来看,它提供了一个方法,- (NSString *)sd_contentTypeForImageData:(NSData *)data{
uint8_t c;
[data getBytes:&c length:1];
switch©{
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;
}

这个方法中干什么呢,获取data,getBytes,获取字节,获取多少个字节,1个,这个data是那个图片的二进制数据,它会获取这个二进制数据的第一个字节,为什么要获取第一个字节,因为第一个字节,就代表了这个文件的类型,好,我们看一眼啊,我可以随便拖一张图片进来,

把这个2.gif拖到项目里来,

拖进来,点击Finish,

在这个2.gif,点右键,选择Open As,选择Hex,16进制,我以16进制的方式,把它打开,

好,第一个数字是多少,47,吧,然后右边这块儿,是什么,GIF89a,…?..e.,GIF吧,这块儿是GIF,我们来看SDWebImage里边的NSData+ImageContentType这个分类,

看这里,0x47:return @“image/gif”,0x47,果然对应的是GIF,当47的时候是什么,GIF吧,这是第一个字节,根据第一个字节,去判断这个文件的类型,你可以自己再去证明一下jpeg,和png,跟这块儿都是对应的,是没有问题的,所以啊,SDWebImage里边,它有一个类,它是怎么去判断文件类型的,

是根据文件的第一个字节,来判断它是什么类型的,
4.SDWebImage缓存文件的名称,如何防止冲突,它是怎么处理的,我们看过了,怎么处理的,我们看过下载的那个图片的文件名了,是,为了防止缓存的图片名称冲突,所以根据md5,计算的,使用md5计算这个名称,目的就是为了防止图片名称冲突,关于md5,我们后边要解释,md5生成的随机的那个内容,并不是绝对不会重复的,它可能会重复,但是重复的几率很小很小很小,那就是几乎不会重复的,好,那我们怎么来获取一个文件的md5值,
终端中测试:echo -n “图片路径” | md5
这里边的echo:是回显,
-n:是输入一个内容,输入一个“图片路径”,
|:竖线,是把“图片路径”,输入给md5,这个程序,这个程序,会根据这个图片,计算出来这个图片的md5值,这是终端的命令,那么,需要一个图片的路径