-
NSURLSession組件
-
關(guān)系:URL有Session,Session管理與協(xié)調(diào)多個(gè)Task
NSURLSession組件 -
使用步驟
- 使用NSURLSession對(duì)象創(chuàng)建Task,然后執(zhí)行Task,Task可以啟動(dòng)、暫停、恢復(fù)、取消
- 啟動(dòng)、恢復(fù):[task resume];
- 暫停:[task suspend];
- 取消:[task cancel];
-
Session的類(lèi)型
有3種類(lèi)型
- Default Session:持久化的,存在disk的cache上,并在用戶(hù)keychain上存儲(chǔ)credentials(證書(shū))
- Ephemeral(短暫的) Session:非持久化的,僅是緩存在RAM(內(nèi)存)上
- Background Session:持久化的,存在disk上,而且會(huì)有一個(gè)單獨(dú)的進(jìn)程處理所有的數(shù)據(jù)傳輸,從而支持后臺(tái)任務(wù)的處理。
-
Task的類(lèi)型
Task是一個(gè)抽象類(lèi),有3種類(lèi)型
- NSURLSessionDataTask:可以處理DownloadTask和UploadTask的事情
- 每一個(gè)task都有一個(gè)response對(duì)象
Task層級(jí)關(guān)系
-
具體實(shí)現(xiàn)
- data
- GET
- data
/** GET請(qǐng)求 **/ // 1. 創(chuàng)建URL NSURL *url = [NSURL URLWithString:@""]; // 2. 創(chuàng)建請(qǐng)求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 3. 獲得NSURLSession對(duì)象 NSURLSession *session = [NSURLSession shardSession]; // 3. 獲得NSURLSession對(duì)象,代理實(shí)現(xiàn) NSURLSession *session = [NSURLSession sessionWithConfiguartion:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOpertationQueue alloc] init]]; // 4. 創(chuàng)建任務(wù)(不設(shè)置請(qǐng)求參數(shù)時(shí),可使用該方法) NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)] { NSLog(@"%@", [NSJSONSerialazation JSONObjectWithData:data options:kNilOptions error:nil]); } // 4.創(chuàng)建任務(wù)(需要設(shè)置請(qǐng)求參數(shù)時(shí),使用該方法) NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSLog(@"%@", [NSJSONSerialazation JSONObjectWithData:data options:kNilOptions error:nil]); }]; // 5. 啟動(dòng)任務(wù) [task resume];
- POST
與NSURLConnection的實(shí)現(xiàn)類(lèi)似,只需將請(qǐng)求修改NSMutableRequest類(lèi)型,進(jìn)行設(shè)置即可。
- 代理實(shí)現(xiàn)
objc // 首先調(diào)用,接受到響應(yīng) // Disposition:處理、處置的意思 -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler { // NSURLSessionResponseDisposition枚舉如下: // 1. NSURLSessionResponseCancel 取消接收數(shù)據(jù) // 2. NSURLSessionResponseAllow 允許接收數(shù)據(jù) // 3. NSURLSessionResponseBecomeDownload 轉(zhuǎn)變成下載 } // 接受到數(shù)據(jù)(可能會(huì)調(diào)用多次) -(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { } // 請(qǐng)求成功或失敗都會(huì)調(diào)用,最后調(diào)用 -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { }
- download
- GET & POST
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDownloadTask *task = [NSURLSessionDownloadTask downloadTaskWitURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
// 文件將來(lái)存放的路徑
NSString *file = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestFileName];
// 剪切l(wèi)ocation的臨時(shí)文件到真實(shí)路徑
NSFileManager *mgr = [NSFileManager defaultManager];
[mgr moveItemAtURL:location toURL:[NSURL fileURLWithPath:file] error:nil];
[task resume];
監(jiān)控下載進(jìn)度,要用delegate
// 恢復(fù)任務(wù)的時(shí)候,調(diào)用 -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes { } // 每當(dāng)寫(xiě)入數(shù)據(jù)到臨時(shí)文件中,就會(huì)調(diào)用一次(可能多次調(diào)用) /** totalBytesExpectedToWrite:總大小 totalBytesWritten:已經(jīng)寫(xiě)入的大小 bytesWritten:當(dāng)前一次寫(xiě)入的大小 */ -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite { // 進(jìn)度 NSLog(@"%f", 1.0 * totalBytesWritten / totalBytesExpectedToWrite); } // 下載完畢后調(diào)用 -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location { // 在這里可以將存在臨時(shí)文件夾得數(shù)據(jù)拷貝到自定義文件夾中 } // 最后調(diào)用 #pragma mark - <NSURLSesstionDownloadTaskDelegate> -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { }
- 斷點(diǎn)下載
TODO ...
- 文件上傳
TODO ...