一、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里边,它有一个类,它是怎么去判断文件类型的,



313

被折叠的 条评论
为什么被折叠?



