版本記錄
版本號(hào) | 時(shí)間 |
---|---|
V1.0 | 2018.03.01 |
前言
我們做APP發(fā)起網(wǎng)絡(luò)請(qǐng)求韧拒,都離不開一個(gè)非常有用的框架AFNetworking砍聊,可以說這個(gè)框架的知名度已經(jīng)超過了蘋果的底層網(wǎng)絡(luò)請(qǐng)求部分,很多人可能不知道蘋果底層是如何發(fā)起網(wǎng)絡(luò)請(qǐng)求的蔚润,但是一定知道
AFNetworking
奸远,接下來幾篇我們就一起詳細(xì)的解析一下這個(gè)框架既棺。感興趣的可以看上面寫的幾篇。
1. AFNetworking源碼探究(一) —— 基本介紹
2. AFNetworking源碼探究(二) —— GET請(qǐng)求實(shí)現(xiàn)之NSURLSessionDataTask實(shí)例化(一)
3. AFNetworking源碼探究(三) —— GET請(qǐng)求實(shí)現(xiàn)之任務(wù)進(jìn)度設(shè)置和通知監(jiān)聽(一)
4. AFNetworking源碼探究(四) —— GET請(qǐng)求實(shí)現(xiàn)之代理轉(zhuǎn)發(fā)思想(一)
5. AFNetworking源碼探究(五) —— AFURLSessionManager中NSURLSessionDelegate詳細(xì)解析(一)
6. AFNetworking源碼探究(六) —— AFURLSessionManager中NSURLSessionTaskDelegate詳細(xì)解析(一)
7. AFNetworking源碼探究(七) —— AFURLSessionManager中NSURLSessionDataDelegate詳細(xì)解析(一)
回顧
主要介紹了NSURLSessionDataDelegate
中四個(gè)代理方法的實(shí)現(xiàn)及其使用場(chǎng)景和注意事項(xiàng)懒叛。這一篇我們就看一下NSURLSessionDownloadDelegate
這個(gè)代理丸冕。
1. - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location;
首先看一下蘋果原生的API接口
/* Sent when a download task that has completed a download. The delegate should
* copy or move the file at the given location to a new location as it will be
* removed when the delegate message returns. URLSession:task:didCompleteWithError: will
* still be called.
*/
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location;
看一下AFN中該方法的實(shí)現(xiàn)
- (void)URLSession:(NSURLSession *)session
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location
{
AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:downloadTask];
if (self.downloadTaskDidFinishDownloading) {
NSURL *fileURL = self.downloadTaskDidFinishDownloading(session, downloadTask, location);
if (fileURL) {
delegate.downloadFileURL = fileURL;
NSError *error = nil;
[[NSFileManager defaultManager] moveItemAtURL:location toURL:fileURL error:&error];
if (error) {
[[NSNotificationCenter defaultCenter] postNotificationName:AFURLSessionDownloadTaskDidFailToMoveFileNotification object:downloadTask userInfo:error.userInfo];
}
return;
}
}
if (delegate) {
[delegate URLSession:session downloadTask:downloadTask didFinishDownloadingToURL:location];
}
}
這里代碼都很簡(jiǎn)單,就不多說了薛窥,這里也做了代理的轉(zhuǎn)發(fā)胖烛。
if (delegate) {
[delegate URLSession:session downloadTask:downloadTask didFinishDownloadingToURL:location];
}
還記得那兩個(gè)參與轉(zhuǎn)發(fā)的代理嗎?
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)taskdidCompleteWithError:(NSError *)error;
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data;
2. - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite;
首先看一下蘋果原生的API接口
/* Sent periodically to notify the delegate of download progress. */
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didWriteData:(int64_t)bytesWritten
totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite;
看一下AFN中該方法的實(shí)現(xiàn)
- (void)URLSession:(NSURLSession *)session
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didWriteData:(int64_t)bytesWritten
totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
if (self.downloadTaskDidWriteData) {
self.downloadTaskDidWriteData(session, downloadTask, bytesWritten, totalBytesWritten, totalBytesExpectedToWrite);
}
}
這個(gè)方法和參數(shù)都很好理解诅迷,我就說一點(diǎn)佩番,totalBytesExpectedToWrite
這個(gè)參數(shù)表示期望收到的文件總字節(jié)數(shù),是由Content-Length header
提供罢杉。如果沒有提供答捕,默認(rèn)是NSURLSessionTransferSizeUnknown
。
3. - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes;
首先看一下蘋果原生的API接口
/* Sent when a download has been resumed. If a download failed with an
* error, the -userInfo dictionary of the error will contain an
* NSURLSessionDownloadTaskResumeData key, whose value is the resume
* data.
*/
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didResumeAtOffset:(int64_t)fileOffset
expectedTotalBytes:(int64_t)expectedTotalBytes;
看一下AFN中該方法的實(shí)現(xiàn)
- (void)URLSession:(NSURLSession *)session
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didResumeAtOffset:(int64_t)fileOffset
expectedTotalBytes:(int64_t)expectedTotalBytes
{
if (self.downloadTaskDidResume) {
self.downloadTaskDidResume(session, downloadTask, fileOffset, expectedTotalBytes);
}
}
- 當(dāng)下載被取消或者失敗后重新恢復(fù)下載時(shí)調(diào)用屑那。
- 如果一個(gè)正在下載任務(wù)被取消或者失敗了拱镐,你可以請(qǐng)求一個(gè)
resumeData
對(duì)象(比如在userInfo字典中通過NSURLSessionDownloadTaskResumeData
這個(gè)鍵來獲取到resumeData)并使用它來提供足夠的信息以重新開始下載任務(wù)艘款。
隨后,你可以使用resumeData作為downloadTaskWithResumeData:
或downloadTaskWithResumeData:completionHandler:
的參數(shù)沃琅。當(dāng)你調(diào)用這些方法時(shí)哗咆,你將開始一個(gè)新的下載任務(wù)。一旦你繼續(xù)下載任務(wù)益眉,session會(huì)調(diào)用它的代理方法URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:
其中的downloadTask參數(shù)表示的就是新的下載任務(wù)晌柬,這也意味著下載重新開始了。 - 注意:
fileOffset
這個(gè)參數(shù)郭脂,如果文件緩存策略或者最后文件更新日期阻止重用已經(jīng)存在的文件內(nèi)容年碘,那么該值為0。否則展鸡,該值表示當(dāng)前已經(jīng)下載data的偏移量屿衅。 - 前面幾篇講解的那么多代理方法中,我們做的處理都是相對(duì)于這個(gè)
sessionManager
所有的request的莹弊。是公用的處理涤久。而轉(zhuǎn)發(fā)的3個(gè)代理方法到AF的自定義deleagate,作用是需要對(duì)應(yīng)每個(gè)task去私有化處理忍弛。
后記
本篇主要講述的就是NSURLSessionDownloadDelegate代理在AFN中實(shí)現(xiàn)的幾個(gè)方法响迂。喜歡的給個(gè)關(guān)注吧~~~