NSURLSession是2013年蘋果全球開發(fā)者大會(huì)上(WWDC2013)隨iOS7一起發(fā)布的,是對(duì)NSURLConnection進(jìn)行了重構(gòu)優(yōu)化后的新的網(wǎng)絡(luò)接口。
iOS9.0開始效拭,NSURLConnection中發(fā)送請求的兩個(gè)方法已經(jīng)過期(同步請求/異步請求)故河,初始化網(wǎng)絡(luò)連接的方法也被設(shè)置為過期们衙,系統(tǒng)不在推薦使用,建議使用NSURLSession發(fā)送網(wǎng)絡(luò)請求轨香。見下圖:
https://developer.apple.com/documentation/foundation/nsurlsession?language=occ
NSURLSession介紹:
NSURLSession API包含許多不同的類,他們以一種相當(dāng)復(fù)雜的方式一起工作幼东,如果您單獨(dú)閱讀參考文檔臂容,可能就不太明顯。在使用API之前根蟹,請閱讀URL Loading System概述脓杉。第一步,上次和下載小節(jié)的文章提供了實(shí)用NSURLSession執(zhí)行常見任務(wù)的示例简逮;
附:https://developer.apple.com/documentation/foundation/url_loading_system?language=objc
NSURLSession與NSConnection的區(qū)別
1球散、普通任務(wù)和上傳
NSURLSession針對(duì)上傳/下載等復(fù)雜的網(wǎng)絡(luò)提供了專門的解決方案,針對(duì)普通买决、上傳和下載分別對(duì)應(yīng)三種不同的網(wǎng)絡(luò)請求任務(wù):NSURLSessionDataTask沛婴,NSURLUploadDataTask吼畏,NSURLDownloadDataTask。創(chuàng)建的task都是掛起狀態(tài)嘁灯,需要resume才能啟動(dòng)泻蚊。
當(dāng)服務(wù)器返回的數(shù)據(jù)較小的時(shí)候,NSURLSession和NSURLConnection沒有什么區(qū)別丑婿。執(zhí)行上傳任務(wù)時(shí)性雄,NSURLSession與NSURLConnection一樣需要設(shè)置POST請求的請求體進(jìn)行上傳。
2羹奉、下載任務(wù)方式
NSURLConnection下載文件時(shí)秒旋,先是將整個(gè)文件下載到內(nèi)存,然后在寫入到沙盒诀拭,如果文件比較大迁筛,就會(huì)出現(xiàn)內(nèi)存保障的情況
NSURLSessionDownloadTask下載文件,會(huì)默認(rèn)下載到沙盒的tmp文件中耕挨,不會(huì)出現(xiàn)內(nèi)存暴漲的情況细卧,但是在下載完成后會(huì)把tmp中的臨時(shí)文件刪除,需要在初始化任務(wù)方法時(shí)筒占,在completionHandler回調(diào)中增加保存文件的代碼贪庙。
3、請求方法的控制
NSURLConnection實(shí)例化對(duì)象翰苫,實(shí)例化開始止邮,默認(rèn)請求就發(fā)送不需要調(diào)用start方法。而cancel可以停止請求的發(fā)送奏窑,停止后不能繼續(xù)訪問导披,需要?jiǎng)?chuàng)建新的請求。
NSURLSession有三個(gè)控制方法良哲,cancel盛卡,suspend,resume筑凫,暫停后可以通過繼續(xù)恢復(fù)當(dāng)前的請求任務(wù)滑沧。
4、斷點(diǎn)續(xù)傳的方式
NSURLConnection進(jìn)行斷點(diǎn)下載巍实,通過設(shè)置訪問請求的HTTPHeaderField的Range屬性滓技,開啟運(yùn)行循環(huán),NSURLConnection的代理方法作為運(yùn)行循環(huán)的事件源棚潦,接收到下載數(shù)據(jù)時(shí)代理方法就會(huì)持續(xù)調(diào)用令漂,并使用NSOutputStream管道流進(jìn)行數(shù)據(jù)保存。
NSURLSession進(jìn)行斷點(diǎn)下載,當(dāng)暫停下載任務(wù)后叠必,如果downloadTask為空荚孵,調(diào)用- (void)cancelByProducingResumeData:(void (^)(NSData *resumeData))completionHandler;這個(gè)方法接收一個(gè)參數(shù),完成處理代碼塊纬朝,這個(gè)代碼塊有一個(gè)NSData類型的resumeData參數(shù)收叶,如果resumeData非空,就保存這個(gè)對(duì)象到視圖控制器的resumeData中共苛,在點(diǎn)擊再次下載時(shí)判没,通過調(diào)用- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData ?completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler;方法進(jìn)行繼續(xù)下載操作。
5隅茎、配置信息
NSURLSession通過NSURLSessionConfiguration類的參數(shù)可以設(shè)置配置信息澄峰,其決定了cookie,安全和高速緩存策略辟犀,最大主機(jī)連接數(shù)俏竞,資源管理,網(wǎng)絡(luò)超時(shí)等配置踪蹬。
NSURLConnection不能進(jìn)行這個(gè)配置胞此,而是依賴于一個(gè)全局的配置對(duì)象,缺乏靈活性