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