美文网首页
NSURLSession

NSURLSession

作者: CoderJackieYip | 来源:发表于2016-03-14 22:05 被阅读413次
  • 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
/** 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 ...

相关文章

网友评论

      本文标题:NSURLSession

      本文链接:https://www.haomeiwen.com/subject/bavflttx.html