SDWebImage 4.x版本源码分析(五)SDWebImageDownloaderOperatiion

可以来这里下载一下源码注释

6.SDWebImageDownloaderOperatiion

问题:

①.自定义NSOperation需要做什么?
②.取消下载任务是怎么做到的?
③.NSURLCache

SDWebImageDownloaderOperatiion是继承于NSOperation,创建的子类,重写了-start和isFInished、isExecuting的KVO通知。是一个自定义NSOperation类。
并实现了SDWebImageDownloaderOperationInterface和SDWebImageOperation的代理。

首先看下 重写operation的start方法,start方法在当任务添加到NSOperationQueue后会执行

- (void)start
{
1. 给self加锁
2. 如果self被cancel掉了,就设置finished为YES,reset下载数据和回调block,然后return
3. 添加,如果用户设置了Background模式,则设置一个backgroundTask
4. 如果有session,就用当前的 unownedSession,如果没有,就重新创建并传给ownedSession
5. 获取网络请求的缓存数据
6. 使用session来创建一个NSURLSessionDataTask类型下载任务
7. 如果dataTask创建成功,设置dataTask的优先级,开始执行任务,任务开启,遍历进度块数组 执行第一个下载进度 进度为0
8. 如果创建dataTask失败就执行失败的回调,并重置并返回
}

在start里开启了 NSURLSessionDataTask的任务,在SDWebImageManager里知道该Operation被加入到了NSOperationQueue中,于是自动进行了异步下载图片。

然后就是处理NSURLSession的代理了

1.NSURLSessionDataDelegate

//收到服务端响应,收到了响应头,在一次请求中只会执行一次
- (void)URLSession:(NSURLSession *)session
          dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
 completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler 
{
//获取要下载图片的长度
}

//接收到了数据
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
//下载进度
}

//缓存数据,这里可以使用系统默认的就行,这个是要将response缓存起来
- (void)URLSession:(NSURLSession *)session
          dataTask:(NSURLSessionDataTask *)dataTask
 willCacheResponse:(NSCachedURLResponse *)proposedResponse
 completionHandler:(void (^)(NSCachedURLResponse *cachedResponse))completionHandler
{
//是否使用NSURLCache缓存策略,默认不使用
}

NSURLSessionTaskDelegate

//下载完成或下载失败时的回调方法
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
//在这里下载任务结束,也设置operation的结束,并回调
}

//针对服务器返回的证书进行处理, 需要在该方法中告诉系统是否需要安装服务器返回的证书
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
{
//身份认证的处理
}

你可能感兴趣的:(SDWebImage 4.x版本源码分析(五)SDWebImageDownloaderOperatiion)