首先看下NSURLSessionDelegate等相關(guān)代理方法列表:
NSURLSessionDelegate等代理方法.png
以下為每個(gè)代理方法的作用的詳細(xì)說(shuō)明
1.NSURLSessionDelegate
@protocol NSURLSessionDelegate <NSObject>
@optional
/*
當(dāng)Session invallid(無(wú)效)的時(shí)候穗慕,也是就調(diào)用了invalidateAndCancel 和
finishTasksAndInvalidate方法的時(shí)候要出,會(huì)調(diào)用這個(gè)代理方法
*/
- (void)URLSession:(NSURLSession *)session didBecomeInvalidWithError:(nullable NSError *)error;
/*
NSURLSession接收到后臺(tái)的挑戰(zhàn)的時(shí)候鸽粉,我們要在這里進(jìn)行判斷一下
只要請(qǐng)求的地址是HTTPS的, 就會(huì)調(diào)用這個(gè)代理方法
我們需要在該方法中告訴系統(tǒng), 是否信任服務(wù)器返回的證書
Challenge: 挑戰(zhàn) 質(zhì)問(wèn) (包含了受保護(hù)的區(qū)域)
protectionSpace : 受保護(hù)區(qū)域
NSURLAuthenticationMethodServerTrust : 證書的類型是 服務(wù)器信任
*/
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler;
/*
應(yīng)用在后臺(tái)净刮,而且后臺(tái)所有下載任務(wù)完成后,
在所有其他NSURLSession和NSURLSessionDownloadTask委托方法執(zhí)行完后回調(diào)因悲,可以在該方法中做下載數(shù)據(jù)管理和UI刷新
*/
- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session API_AVAILABLE(ios(7.0), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macos);
@end
2.NSURLSessionTaskDelegate <NSURLSessionDelegate>
@protocol NSURLSessionTaskDelegate <NSURLSessionDelegate>
@optional
/*
系統(tǒng)在發(fā)起請(qǐng)求之前會(huì)調(diào)一個(gè)這個(gè)回調(diào)醉者,
然后在這個(gè)completionHandler里面你告訴系統(tǒng)這個(gè)請(qǐng)求是否要發(fā)出去玛追,是否要修改
(告訴代理現(xiàn)在將開(kāi)始加載延遲的URL會(huì)話任務(wù)。
當(dāng)具有延遲開(kāi)始時(shí)間的后臺(tái)會(huì)話任務(wù)(由earliestBeginDate屬性設(shè)置)準(zhǔn)備就緒時(shí)俱萍,將調(diào)用此方法端壳。只有在等待網(wǎng)絡(luò)負(fù)載時(shí)請(qǐng)求可能變陳舊并需要被新請(qǐng)求替換時(shí),才應(yīng)實(shí)現(xiàn)此委托方法枪蘑。
為了繼續(xù)加載损谦,委托人必須調(diào)用完成處理程序,并傳遞一個(gè)處理方式來(lái)指示任務(wù)應(yīng)該如何進(jìn)行岳颇。傳遞NSURLSessionDelayedRequestCancel處置等效于直接調(diào)用任務(wù)的取消照捡。)
*/
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
willBeginDelayedRequest:(NSURLRequest *)request
completionHandler:(void (^)(NSURLSessionDelayedRequestDisposition disposition, NSURLRequest * _Nullable newRequest))completionHandler
API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0));
/*
告訴代理,在開(kāi)始網(wǎng)絡(luò)加載之前赦役,任務(wù)正在等待麻敌,直到合適的連接可用。
如果NSURLSessionConfiguration的waitsForConnectivity屬性為true并且沒(méi)有足夠的連接掂摔,則調(diào)用此方法术羔。 代表可以利用這個(gè)機(jī)會(huì)來(lái)更新用戶界面;
例如通過(guò)呈現(xiàn)離線模式或僅限蜂窩模式。
此方法最多只能在每個(gè)任務(wù)中調(diào)用一次乙漓,并且僅在連接最初不可用時(shí)調(diào)用级历。 它永遠(yuǎn)不會(huì)被調(diào)用后臺(tái)會(huì)話,因?yàn)檫@些會(huì)話會(huì)忽略waitsForConnectivity叭披。
*/
- (void)URLSession:(NSURLSession *)session taskIsWaitingForConnectivity:(NSURLSessionTask *)task
API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0));
/*
告訴委托遠(yuǎn)程服務(wù)器請(qǐng)求HTTP重定向寥殖。
此方法僅適用于默認(rèn)和臨時(shí)會(huì)話中的任務(wù)。 后臺(tái)會(huì)話中的任務(wù)會(huì)自動(dòng)遵循重定向涩蜘。
需要后臺(tái)返回statusCode=302/301這兩種狀態(tài)同時(shí)要配置上新的request
*/
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
willPerformHTTPRedirection:(NSHTTPURLResponse *)response
newRequest:(NSURLRequest *)request
completionHandler:(void (^)(NSURLRequest * _Nullable))completionHandler;
/*
響應(yīng)來(lái)自遠(yuǎn)程服務(wù)器的認(rèn)證請(qǐng)求嚼贡,從代理請(qǐng)求憑證。
該方法處理任務(wù)級(jí)別的身份驗(yàn)證挑戰(zhàn)同诫。 NSURLSessionDelegate協(xié)議還提供了會(huì)話級(jí)別的身份驗(yàn)證委托方法粤策。所調(diào)用的方法取決于身份驗(yàn)證挑戰(zhàn)的類型:
對(duì)于會(huì)話級(jí)挑戰(zhàn)-NSURLAuthenticationMethodNTLM,NSURLAuthenticationMethodNegotiate误窖,NSURLAuthenticationMethodClientCertificate或NSURLAuthenticationMethodServerTrust - NSURLSession對(duì)象調(diào)用會(huì)話委托的URLSession:didReceiveChallenge:completionHandler:方法叮盘。如果您的應(yīng)用程序未提供會(huì)話委托方法秩贰,則NSURLSession對(duì)象會(huì)調(diào)用任務(wù)委托人的URLSession:task:didReceiveChallenge:completionHandler:方法來(lái)處理該挑戰(zhàn)。
對(duì)于非會(huì)話級(jí)挑戰(zhàn)(所有其他挑戰(zhàn))柔吼,NSURLSession對(duì)象調(diào)用會(huì)話委托的URLSession:task:didReceiveChallenge:completionHandler:方法來(lái)處理挑戰(zhàn)毒费。如果您的應(yīng)用程序提供會(huì)話委托,并且您需要處理身份驗(yàn)證愈魏,那么您必須在任務(wù)級(jí)別處理身份驗(yàn)證觅玻,或者提供明確調(diào)用每會(huì)話處理程序的任務(wù)級(jí)別處理程序。會(huì)話委托的URLSession:didReceiveChallenge:completionHandler:方法不針對(duì)非會(huì)話級(jí)別的挑戰(zhàn)進(jìn)行調(diào)用蝌戒。
*/
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler;
/*
當(dāng)任務(wù)需要新的請(qǐng)求主體流發(fā)送到遠(yuǎn)程服務(wù)器時(shí)串塑,告訴委托。
這種委托方法在兩種情況下被調(diào)用:
1北苟、如果使用uploadTaskWithStreamedRequest創(chuàng)建任務(wù)桩匪,則提供初始請(qǐng)求正文流:
2、如果任務(wù)因身份驗(yàn)證質(zhì)詢或其他可恢復(fù)的服務(wù)器錯(cuò)誤需要重新發(fā)送包含正文流的請(qǐng)求友鼻,則提供替換請(qǐng)求正文流傻昙。
注:如果代碼使用文件URL或NSData對(duì)象提供請(qǐng)求主體,則不需要實(shí)現(xiàn)此功能彩扔。
*/
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
needNewBodyStream:(void (^)(NSInputStream * _Nullable bodyStream))completionHandler;
/*
定期通知代理向服務(wù)器發(fā)送主體內(nèi)容的進(jìn)度妆档。(上傳進(jìn)度)
*/
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didSendBodyData:(int64_t)bytesSent
totalBytesSent:(int64_t)totalBytesSent
totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend;
/*
告訴代理該會(huì)話完成了該任務(wù)的收集指標(biāo)。
*/
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));
/*
告訴代理該任務(wù)完成傳輸數(shù)據(jù)虫碉。
*/
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(nullable NSError *)error;
@end
3.NSURLSessionDataDelegate <NSURLSessionTaskDelegate>
@optional
/*
告訴代理數(shù)據(jù)任務(wù)從服務(wù)器收到初始回復(fù)(headers)贾惦。
//取消加載, 與[task cancel]一致
NSURLSessionResponseCancel = 0,
// 繼續(xù)加載
NSURLSessionResponseAllow = 1,
//轉(zhuǎn)為下載
NSURLSessionResponseBecomeDownload = 2,
//轉(zhuǎn)為任務(wù)流
NSURLSessionResponseBecomeStream API_AVAILABLE(macos(10.11), ios(9.0), watchos(2.0), tvos(9.0)) = 3
*/
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler;
/*
告訴代理數(shù)據(jù)任務(wù)已更改為下載任務(wù)。
當(dāng)委托的URLSession:dataTask:didReceiveResponse:completionHandler:方法決定將數(shù)據(jù)請(qǐng)求的處置更改為下載時(shí)敦捧,會(huì)話將調(diào)用此委托方法為你提供新的下載任務(wù)须板。 在此調(diào)用之后,會(huì)話委托不會(huì)收到與原始數(shù)據(jù)任務(wù)相關(guān)的其他委托方法調(diào)用
*/
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask;
/*
告訴委托數(shù)據(jù)任務(wù)已更改為流任務(wù)
當(dāng)委托的URLSession:dataTask:didReceiveResponse:completionHandler:方法決定將處置從數(shù)據(jù)請(qǐng)求更改為流時(shí)兢卵,會(huì)話將調(diào)用此委托方法為你提供新的流任務(wù)习瑰。 在此調(diào)用之后,會(huì)話委托不會(huì)收到與原始數(shù)據(jù)任務(wù)相關(guān)的其他委托方法調(diào)用秽荤。
對(duì)于pipelined的請(qǐng)求甜奄,流任務(wù)將只允許讀取,并且對(duì)象將立即發(fā)送委托消息URLSession:writeClosedForStreamTask :. 通過(guò)在其NSURLSessionConfiguration對(duì)象上設(shè)置HTTPShouldUsePipelining屬性窃款,或通過(guò)在NSURLRequest對(duì)象上設(shè)置HTTPShouldUsePipelining屬性來(lái)為各個(gè)請(qǐng)求設(shè)置會(huì)話中的所有請(qǐng)求课兄,可以禁用管道傳輸。
*/
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didBecomeStreamTask:(NSURLSessionStreamTask *)streamTask;
/*
告訴代理該數(shù)據(jù)任務(wù)已經(jīng)收到了一些預(yù)期的數(shù)據(jù)晨继。
由于NSData對(duì)象通常是由許多不同的數(shù)據(jù)對(duì)象拼湊而成的第喳,因此盡可能使用NSData的enumerateByteRangesUsingBlock:方法遍歷數(shù)據(jù),而不是使用bytes方法(將NSData對(duì)象平化為單個(gè)內(nèi)存塊)踱稍。
此委托方法可能被多次調(diào)用曲饱,并且每次調(diào)用僅提供自上次調(diào)用后收到的數(shù)據(jù)。 如果需要珠月,該應(yīng)用負(fù)責(zé)積累這些數(shù)據(jù)扩淀。
*/
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data;
/*
詢問(wèn)委托數(shù)據(jù)(或上傳)任務(wù)是否應(yīng)將響應(yīng)存儲(chǔ)在緩存中。
會(huì)話在任務(wù)完成接收所有預(yù)期數(shù)據(jù)后調(diào)用此委托方法啤挎。如果未實(shí)現(xiàn)此方法驻谆,則默認(rèn)行為是使用會(huì)話配置對(duì)象中指定的緩存策略。此方法的主要目的是防止特定URL的緩存或修改與URL響應(yīng)關(guān)聯(lián)的userInfo字典庆聘。
只有在處理請(qǐng)求的NSURLProtocol決定緩存響應(yīng)時(shí)才調(diào)用此方法胜臊。通常,只有滿足以下所有條件時(shí)才會(huì)緩存響應(yīng):
1伙判、請(qǐng)求是針對(duì)HTTP或HTTPS URL(或你自己的支持緩存的自定義網(wǎng)絡(luò)協(xié)議)象对。
2、請(qǐng)求成功(狀態(tài)碼在200-299范圍內(nèi))宴抚。
3勒魔、提供的響應(yīng)來(lái)自服務(wù)器,而不是緩存菇曲。
4冠绢、會(huì)話配置的緩存策略允許緩存。
5常潮、提供的NSURLRequest對(duì)象的緩存策略(如果適用)允許緩存弟胀。
6、服務(wù)器響應(yīng)中的緩存相關(guān)頭(如果存在)允許緩存喊式。
7孵户、響應(yīng)大小足夠小,可以合理地放入緩存中垃帅。 (例如延届,如果您提供磁盤緩存,則響應(yīng)不得超過(guò)磁盤緩存大小的5%贸诚。)
注:如果委托實(shí)現(xiàn)此方法方庭,則它必須調(diào)用completionHandler完成處理程序;否則,應(yīng)用程序會(huì)泄漏內(nèi)存酱固。
*/
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
willCacheResponse:(NSCachedURLResponse *)proposedResponse
completionHandler:(void (^)(NSCachedURLResponse * _Nullable cachedResponse))completionHandler;
@end
4.NSURLSessionDownloadDelegate <NSURLSessionTaskDelegate>
/*
告訴委托下載任務(wù)已完成下載械念。
location:
臨時(shí)文件的文件URL。 由于該文件是臨時(shí)文件运悲,因此必須先打開(kāi)文件進(jìn)行閱讀或?qū)⑵湟浦翍?yīng)用程序的沙箱容器目錄中的永久位置龄减,然后才能從此委派方法返回。
如果選擇打開(kāi)文件進(jìn)行閱讀班眯,則應(yīng)該在另一個(gè)線程中進(jìn)行實(shí)際閱讀希停,以避免阻塞委托隊(duì)列烁巫。
*/
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location;
@optional
/*
定期通知代理有關(guān)下載的進(jìn)度。
*/
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didWriteData:(int64_t)bytesWritten
totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite;
/*
告訴委托下載任務(wù)已經(jīng)恢復(fù)下載宠能。
filrOffest:
如果文件的緩存策略或上次修改日期阻止重新使用現(xiàn)有內(nèi)容亚隙,則該值為零。否則违崇,該值是一個(gè)整數(shù)阿弃,表示磁盤上不需要再次檢索的字節(jié)數(shù)。
如果可恢復(fù)的下載任務(wù)被取消或失敗羞延,可以請(qǐng)求resumeData對(duì)象渣淳,該對(duì)象將提供足夠的信息以重新開(kāi)始下載。稍后伴箩,你可以調(diào)用downloadTaskWithResumeData:或downloadTaskWithResumeData:completionHandler:使用該數(shù)據(jù)入愧。
當(dāng)你調(diào)用這些方法時(shí),你會(huì)得到一個(gè)新的下載任務(wù)赛蔫。只要恢復(fù)該任務(wù)砂客,會(huì)話就會(huì)使用該新任務(wù)調(diào)用其委托的URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:方法,以指示恢復(fù)下載呵恢。
*/
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didResumeAtOffset:(int64_t)fileOffset
expectedTotalBytes:(int64_t)expectedTotalBytes;
@end
5.NSURLSessionStreamDelegate <NSURLSessionTaskDelegate>
@optional
/*
告訴委托底層套接字的讀取面已經(jīng)關(guān)閉鞠值。
即使當(dāng)前過(guò)程沒(méi)有讀取,也可以調(diào)用此方法渗钉。 此方法并不表示流達(dá)到end-of-file(EOF)彤恶,從而不能讀取更多數(shù)據(jù)。
*/
- (void)URLSession:(NSURLSession *)session readClosedForStreamTask:(NSURLSessionStreamTask *)streamTask;
/*
告訴委托底層套接字的寫入端已關(guān)閉鳄橘。
即使當(dāng)前過(guò)程沒(méi)有寫入声离,也可以調(diào)用此方法。
*/
- (void)URLSession:(NSURLSession *)session writeClosedForStreamTask:(NSURLSessionStreamTask *)streamTask;
/*
告訴委托流已經(jīng)檢測(cè)到通往主機(jī)更好的路由
*/
- (void)URLSession:(NSURLSession *)session betterRouteDiscoveredForStreamTask:(NSURLSessionStreamTask *)streamTask;
/*
告訴委托瘫怜,流任務(wù)已完成术徊,由于流任務(wù)調(diào)用captureStreams方法。
此委托方法僅在流任務(wù)的所有入隊(duì)讀取和寫入操作完成后才會(huì)調(diào)用鲸湃。
*/
- (void)URLSession:(NSURLSession *)session streamTask:(NSURLSessionStreamTask *)streamTask
didBecomeInputStream:(NSInputStream *)inputStream
outputStream:(NSOutputStream *)outputStream;
@end
參考文獻(xiàn):http://www.reibang.com/p/2ab336db172c