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í)行不同類型的請求操作:NSURLSessionDataTask、NSURLSessionUploadTask和NSURLSessionDownloadTask。創(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ù)。