-
NSURLSession组件
-
关系:URL有Session,Session管理与协调多个Task
NSURLSession组件
-
使用步骤
- 使用NSURLSession对象创建Task,然后执行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对象
Task层级关系
-
具体实现
- data
- GET
- data
/** GET请求 **/ // 1. 创建URL NSURL *url = [NSURL URLWithString:@""]; // 2. 创建请求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 3. 获得NSURLSession对象 NSURLSession *session = [NSURLSession shardSession]; // 3. 获得NSURLSession对象,代理实现 NSURLSession *session = [NSURLSession sessionWithConfiguartion:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOpertationQueue alloc] init]]; // 4. 创建任务(不设置请求参数时,可使用该方法) NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)] { NSLog(@"%@", [NSJSONSerialazation JSONObjectWithData:data options:kNilOptions error:nil]); } // 4.创建任务(需要设置请求参数时,使用该方法) 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的实现类似,只需将请求修改NSMutableRequest类型,进行设置即可。
- 代理实现
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];
// 剪切location的临时文件到真实路径
NSFileManager *mgr = [NSFileManager defaultManager];
[mgr moveItemAtURL:location toURL:[NSURL fileURLWithPath:file] error:nil];
[task resume];
监控下载进度,要用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 ...
网友评论