第三方库SDWebImage②请求-①简介

必备知识架构-第三方库SDWebImage②请求-①简介

[toc]

2、SDWebImageDownloader 异步的图片下载器

SDWebImageDownloader是一个异步的图片下载器,它是一个单例类,主要负责图片的下载操作的管理。图片的下载是放在一个NSOperationQueue操作队列中来完成的,默认情况下,队列最大并发数是6。如果需要的话,我们可以通过SDWebImageDownloader类的maxConcurrentDownloads属性来修改。其声明如下:

3、SDWebImageDownloaderOperation 下载操作

下面我们来说一说SDWebImage的下载操作SDWebImageDownloaderOperation。该类继承自NSOperation,并且采用了 SDWebImageDownloaderOperationInterface, SDWebImageOperation, NSURLSessionTaskDelegate, NSURLSessionDataDelegate 四个协议方法。

①、SDWebImageDownloaderOperation的下载请求

先通过URL等生成NSURLRequest,并设置给operation属性。

1
2
3
4
5
6
7
声明:
@property (strong, nonatomic, readonly, nullable) NSURLRequest *request;

定义:
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url
cachePolicy:cachePolicy
timeoutInterval:timeoutInterval];

有时候下我们希望它支持后台下载。所以在operation的start方法中,如果支持后台shouldContinueWhenAppEntersBackground,则将当前请求添加到后台任务中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Class UIApplicationClass = NSClassFromString(@"UIApplication");
BOOL hasApplication = UIApplicationClass && [UIApplicationClass respondsToSelector:@selector(sharedApplication)];
if (hasApplication && [self shouldContinueWhenAppEntersBackground]) {
__weak __typeof__ (self) wself = self;
UIApplication * app = [UIApplicationClass performSelector:@selector(sharedApplication)];
self.backgroundTaskId = [app beginBackgroundTaskWithExpirationHandler:^{
__strong __typeof (wself) sself = wself;

if (sself) {
[sself cancel];

[app endBackgroundTask:sself.backgroundTaskId];
sself.backgroundTaskId = UIBackgroundTaskInvalid;
}
}];
}

对于图片的下载,SDWebImageDownloaderOperation的下载使用NSURLSession类。

1
self.dataTask = [session dataTaskWithRequest:self.request];
1
2
3
4
5
6
7
8
9
10
11
12
if (self.dataTask) {
[self.dataTask resume];

......
// 任务开始后,会在主线程抛出下载开始通知
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStartNotification object:weakSelf];
});
} else {
......
}

END