NSURLConnection和NSURLSession的區(qū)別

1.NSURLConnection的常用方法

發(fā)送網(wǎng)絡(luò)請求的三種方法:這幾個(gè)api現(xiàn)在都被廢棄了

發(fā)送同步請求 ?sendSynchronousRequest:(NSURLRequest *)request

發(fā)送異步請求 ?sendAsynchronousRequest:(NSURLRequest*) request

代理發(fā)送異步請求 ?)initWithRequest:(NSURLRequest *)request delegate:(nullable id)delegate

2.NSURLSession的常用方法

兩個(gè)主要的概念session和task

創(chuàng)建session有兩種方法:

1.NSURLSession* session = [NSURLSessionsharedSession];

2NSURLSession* session = [NSURLSessionsessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]delegate:self delegateQueue:[[NSOperationQueue alloc]init]];設(shè)置了代理和任務(wù)執(zhí)行的隊(duì)列

??:這里就是一個(gè)用了NSOperation但是沒有用gcd的??

創(chuàng)建task:可以創(chuàng)建三種類型的task,NSURLSessionTask并沒有做實(shí)質(zhì)的事,他有三個(gè)不同的子類,負(fù)責(zé)執(zhí)行不同類型的請求操作:NSURLSessionDataTaskNSURLSessionUploadTaskNSURLSessionDownloadTask。創(chuàng)建完之后的狀態(tài)都是掛起,需要手動resume。

??:NSURLSessionConfiguration是創(chuàng)建session時(shí)設(shè)置的請求參數(shù),這個(gè)參數(shù)包含哪些信息呢?

3.下載文件的區(qū)別

NSURLConnection下載文件的時(shí)候先把文件下載到內(nèi)存,然后寫入沙盒,這樣做如果下載的文件非常大就會引起內(nèi)存的暴增,原生的NSURLConnectionAPI是沒有辦法解決這個(gè)問題的,需要我們進(jìn)行額外的操作。

思路:

1.在接受到響應(yīng)的時(shí)候,即在didReceiveResponse中創(chuàng)建一個(gè)空的沙盒文件,并且創(chuàng)建一個(gè)NSFilehandle類。

2.在接受到具體數(shù)據(jù)的時(shí)候,即在didReceiveData中向沙盒文件中寫入數(shù)據(jù)。

通過NSFilehandle的- (void)seekToFileOffset:(unsigned long long)offset;方法,制定文件的寫入位置?;蛘咄ㄟ^NSFilehandle的- (unsigned long long)seekToEndOfFile;方法,直接制定文件的寫入位置為文件末尾。

然后通過NSFilehandle的writeData方法,我們可以將數(shù)據(jù)不斷寫入沙盒文件。

3.在下載完成之后,關(guān)閉沙盒文件。

NSURLSession就不需要這么麻煩了,他在下載文件的時(shí)候自動就實(shí)現(xiàn)了一邊下載一邊寫入沙盒的操作。使用NSURLSessionUploadTask下載文件,會默認(rèn)下載到沙盒中的tem文件中,不會出現(xiàn)內(nèi)存暴漲的情況,但是在下載完成后會把temp中的臨時(shí)文件刪除,需要在初始化任務(wù)方法時(shí),在completionHandler回調(diào)中增加保存文件的代碼。還有一個(gè)缺點(diǎn)是無法獲取下載文件的進(jìn)度。

思路:

[self.taskcancelByProducingResumeData:^(NSData*_NullableresumeData) {

???????self.resumeData= resumeData;

??? }];

取消以后再開始下載的時(shí)候,通過resumeData重新創(chuàng)建一個(gè)task

if(self.resumeData) {

???????//如果resumeData有值的話,就說明是暫停以后繼續(xù)下載的,重新定義task

???????self.task= [self.sessiondownloadTaskWithResumeData:self.resumeData];

??? }

??:NSURLSession沒辦法做到離線斷點(diǎn)續(xù)傳。

4.發(fā)送請求的區(qū)別

NSURLConnection實(shí)例化對象,實(shí)例化開始,默認(rèn)請求就發(fā)送(同步發(fā)送),不需要調(diào)用start方法。而cancel可以停止請求的發(fā)送,停止后不能繼續(xù)訪問,需要創(chuàng)建新的請求。

NSURLSession有三個(gè)控制方法,取消(cancel)、暫停(suspend)、繼續(xù)(resume),暫停以后可以通過繼續(xù)恢復(fù)當(dāng)前的請求任務(wù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容