1 .SDWebImage的缓存策略
SDWebImage 的图片缓存默认情况采用的是 Memory 和 Disk 双重缓存机制。下载之前先去Memory中查找图片数据,找到直接返回使用;找不到再到Disk中查找图片数据,找到后放入Memory中再返回使用;如果Disk中也找不到再去下载图片;下载到图片后显示图片并将图片数据存到Memory和Disk中。
2. SDWebImage 缓存图片命名规则?
为了防止名称重复,对其进行 md5 运算
3.默认下载时长和默认缓存时长?
_maxCacheAge = kDefaultCacheMaxCacheAge;
static const NSInteger kDefaultCacheMaxCacheAge = 60 60 24 * 7; // 1 week
//下载时长
15秒
4.磁盘清理时间点?
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(deleteOldFiles)
name:UIApplicationWillTerminateNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(backgroundDeleteOldFiles)
name:UIApplicationDidEnterBackgroundNotification
object:nil];
分别在『应用被杀死时』和 『应用进入后台时』进行清理操作
5. SDWebImage的最大并发数是多少?
_downloadQueue.maxConcurrentOperationCount = 6
6.SDWebImage防止同一个url多次加载?
SDWebImageDownloader中有一个可变字典属性。
@property (strong, nonatomic) NSMutableDictionary *URLCallbacks;
通过下面的代码我们可以看出来字典中key是图片的url,value是一个可变数组,数组里面是一个一个的字典,每个字典中保存了下载过程回调和完成回调。每个字典相当于一次下载请求,但是只有第一次的下载请求才会真正去执行下载操作。这样就防止同一个url多次加载。
- (void)addProgressCallback:(SDWebImageDownloaderProgressBlock)progressBlock completedBlock:(SDWebImageDownloaderCompletedBlock)completedBlock forURL:(NSURL *)url createCallback:(SDWebImageNoParamsBlock)createCallback {
// The URL will be used as the key to the callbacks dictionary so it cannot be nil. If it is nil immediately call the completed block with no image or data.
if (url == nil) {
if (completedBlock != nil) {
completedBlock(nil, nil, nil, NO);
}
return;
}
dispatch_barrier_sync(self.barrierQueue, ^{
BOOL first = NO;
if (!self.URLCallbacks[url]) {
self.URLCallbacks[url] = [NSMutableArray new];
first = YES;
}
// Handle single download of simultaneous download request for the same URL
NSMutableArray *callbacksForURL = self.URLCallbacks[url];
NSMutableDictionary *callbacks = [NSMutableDictionary new];
if (progressBlock) callbacks[kProgressCallbackKey] = [progressBlock copy];
if (completedBlock) callbacks[kCompletedCallbackKey] = [completedBlock copy];
[callbacksForURL addObject:callbacks];
self.URLCallbacks[url] = callbacksForURL;
//执行下载操作
if (first) {
createCallback();
}
});
}
在图片下载完成或者取消下载,根据url将URLCallbacks中的数组移除。