Session是會(huì)話的意思.當(dāng)我們需要跟服務(wù)器進(jìn)行交互,我們可以只需要?jiǎng)?chuàng)建一個(gè)全局的單例會(huì)話
NSURLSession創(chuàng)建的會(huì)話,中的下載/上傳/等任務(wù)默認(rèn)都是掛起的,需要手動(dòng)進(jìn)行resume開啟
所有的任務(wù)都是由單例session來管理的
1.創(chuàng)建單例Session
NSURLSession *session = [NSURLSession sharedSession];
2.NSURLSessionDataTask 是專門創(chuàng)建任務(wù)會(huì)話的 ?并且所有的任務(wù)都是由會(huì)話發(fā)起的
NSURLSessionDataTask *task
= [session dataTaskWithURL:url completionHandler:^(NSData *data , NSURLResponse , NSError *error){
// 在這進(jìn)行反序列化
}];
3.啟動(dòng)會(huì)話
[task resume];
總之熟練使用可以將URL作為參數(shù)傳遞,抽出一個(gè)方法來使用
相比NSURLConnection ? 盡量多使用NSURLSession ?,因?yàn)??NSURLSession在異步上面的處理比NSURLConnection要好
使用NSURLSession進(jìn)行下載使用的方法是
[session downloadTaskWithURL: completionHandler:^(){
//// 這里邊對(duì)下載的文件進(jìn)行處理
}]
并且下載的文件是保存在沙盒的tmp文件夾中,如果在回調(diào)中不做處理是會(huì)被自動(dòng)刪除的
因?yàn)樵谙螺d時(shí),一般zip文件是比較多的,可以替用戶節(jié)約流量
zip包需要進(jìn)行解壓,解壓完成之后,原始的zip包就不需要了.
下載進(jìn)度跟進(jìn)
在NSURLSession中提供了3個(gè)代理方法:
1.下載完成方法
- (void)NSURLSession: downloadTask: didFinishedDownloadingToURL:
2.下載進(jìn)度
- (void)NSURLSession: downloadTask: didWriteData: totalBytesWritten: totalBytesExceptedToWrite:{
float progress = (float) totalBytesWritten / totalBytesExceptedToWrite;
//progress 就是下載進(jìn)度
}
3.下載續(xù)傳數(shù)據(jù)
- (void)NSURLSession: downloadTask: didResumeAtOffset: exceptedTotalBytes:
注意:如果需要做iOS7的適配的話這3個(gè)方法是必須都寫的,但是不做iOS7適配的話,只需要寫下載的方法就可以
NSURLSession的斷點(diǎn)續(xù)傳
主要是暫停和續(xù)傳
暫停任務(wù):
這里跳進(jìn)NSURLSessionDownloadTask中可以看見方法
- (void)cancelByProducingResumeData: ?(NSData *resumeData)
這里續(xù)傳需要跟進(jìn)下載進(jìn)度,所以不能使用塊代碼回調(diào)的方式 ?所以需要一個(gè)全局的下載屬性downloadTask ?用它來進(jìn)行下載,并且需要注意:開始任務(wù)resume
需要注意的地方:
如果暫停方法已經(jīng)執(zhí)行,就是任務(wù)已經(jīng)被暫停的話,不應(yīng)該能夠被再次暫停
方法有幾種,看自己喜好:
1.可以將下載任務(wù)至為 nil
2.也可以申請(qǐng)一個(gè)isSuspend屬性來判斷是否點(diǎn)擊了暫停(個(gè)人想法,未驗(yàn)證)
繼續(xù)任務(wù):
這里需要用到的是下載類中的方法
downloadTaskWithResumeData:(NSData *)
這里需要用到的是二進(jìn)制數(shù)據(jù),所以需要拿到暫停任務(wù)的地方的數(shù)據(jù)resumeData,繼續(xù)申請(qǐng)全局的屬性resumeData來進(jìn)行任務(wù)的繼續(xù)
注意:
1.使用"續(xù)傳數(shù)據(jù)"啟動(dòng)下載任務(wù)的話,使用的是之前保存的續(xù)傳數(shù)據(jù)(這個(gè)問題是如果連續(xù)點(diǎn)擊繼續(xù)按鈕的話,下載任務(wù)一直會(huì)從暫停任務(wù)那里保存的下載進(jìn)度開始的,所以多次點(diǎn)擊,就會(huì)出問題)
所以續(xù)傳數(shù)據(jù)的作用就是建立新的下載任務(wù),所以在建立續(xù)傳任務(wù)之后,需要將resumeData至為nil
!!!而且千萬(wàn)不要忘記,所有任務(wù)默認(rèn)都是掛起的,需要resume