1、简介
>iOS7.0推出,用于替代NSURLConnection。
> 支持后台运行的网络任务。
> 暂停,停止,重启网络任务,不需要NSOperation封装。
> 请求可以使用同样的 配置容器。
> 不同的session 可以使用不同的私有存储。
>block 和代理可以同时起作用。
> 直接从文件系统上传,下载。
2、NSURLSession常见代码演练
2.1、获取JSON数据。
// 加载数据
- (void)loadData{
//1.创建 url
NSURL*url = [NSURL URLWithString:@"http://localhost/demo.json"];
//2.为了程序员方便开发,苹果提供了一个全局的 session 对象
//获取全局的会话对象
NSURLSession *session = [NSURLSession sharedSession];
//3.获得数据任务对象
//所以的任务都是由 session 发起的,不要通过 alloc init 创建任务对象
NSURLSessionDataTask *task = [session dataTaskWithURL:urlcompletionHandler:^(NSData * _Nullable data,NSURLResponse * _Nullable response, NSError* _Nullable error) {
id result =[NSJSONSerializationJSONObjectWithData:data options:0 error:NULL];
NSLog(@"result = %@",result);
}];
//4.继续任务
[taskresume];
}
NSURLSession须知:
> 为了方便程序员使用,苹果提供了一个全局 session
> 所有的 任务(Task)都是由session 发起的
> 所有的任务默认是挂起的,需要 resume
3、NSURLSession下载文件和解压缩zip包
- (void)download{
//1.创建下载 url
NSURL*url = [NSURL URLWithString:@"http://localhost/1234.mp4"];
NSLog(@"开始下载");
//2.开始下载
[[[NSURLSession sharedSession] downloadTaskWithURL:urlcompletionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
NSLog(@"location = %@ -- %@",location,[NSThreadcurrentThread]);
NSLog(@"下载完成");
// 异步解压缩
// location.path:没有‘协议头’的路径
// location.absoluteString:包含 ‘协议头‘’的完成 url 路径
[SSZipArchive unzipFileAtPath:location.path toDestination:cacheDirdelegate:self];
}]resume];
}
4、下载进度跟进
- (void)download{
// 1.创建下载 url
NSURL *url = [NSURL URLWithString:@"http://localhost/1234.mp4"];
NSLog(@"开始下载");
// 2.开始下载
[[self.sessiondownloadTaskWithURL:url] resume];
}
#pragmamark - NSURLSessionDownloadDelegate
/**
* 下载完毕回调
*
* @param session 会话对象
* @param downloadTask 下载任务对象
* @param location 下载路径
*/
- (void)URLSession:(NSURLSession *)sessiondownloadTask:(NSURLSessionDownloadTask *)downloadTaskdidFinishDownloadingToURL:(NSURL *)location {
NSLog(@"location = %@",location);
}
/**
* 接收到数据回调
*
* @param session 会话对象
* @param downloadTask 下载任务对象
* @param bytesWritten 本次下载字节数
* @param totalBytesWritten 已经下载字节数
* @param totalBytesExpectedToWrite 总大小字节数
*/
- (void)URLSession:(NSURLSession *)sessiondownloadTask:(NSURLSessionDownloadTask *)downloadTaskdidWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWrittentotalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{
// 计算进度
CGFloat progress = (CGFloat)totalBytesWritten /totalBytesExpectedToWrite;
NSLog(@"progress = %f---%@",progress,[NSThreadcurrentThread]);
}
/**
* 续传代理方法:没有什么用
*/
- (void)URLSession:(NSURLSession *)sessiondownloadTask:(NSURLSessionDownloadTask *)downloadTaskdidResumeAtOffset:(int64_t)fileOffsetexpectedTotalBytes:(int64_t)expectedTotalBytes{
NSLog(@"---%s",__func__);
}
#pragma mark - 懒加载会话对象
- (NSURLSession*)session {
if (_session == nil) {
// 创建会话配置对象
NSURLSessionConfiguration *config =[NSURLSessionConfiguration defaultSessionConfiguration];
/**
参数:
configuration:会话配置,大多使用默认的。
delegate:代理,一般是控制器
delegateQueue:代理回调的队列,可以传入 nil.
*/
_session = [NSURLSessionsessionWithConfiguration:config delegate:selfdelegateQueue:nil];
}
return _session;
}
5、下载暂停和继续
/**
* 开始下载
*/
- (IBAction)start{
//1.创建下载 url
NSURL *url = [NSURL URLWithString:@"http://dlsw.baidu.com/sw-search-sp/soft/2a/25677/QQ_V4.0.3_setup.1435732931.dmg"];
self.task = [self.sessiondownloadTaskWithURL:url];
[self.task resume];
}
/**
* 暂停下载
*/
- (IBAction)pause{
//只有运行的任务才需要挂起
if (self.task.state== NSURLSessionTaskStateRunning) {
NSLog(@"pause = %@",self.task);
[self.task suspend];
}
}
/**
* 继续下载
*/
- (IBAction)resume{
//只有被挂起的任务才需要继续
if (self.task.state== NSURLSessionTaskStateSuspended) {
NSLog(@"resume = %@",self.task);
[self.task resume];
}
}
NSURLConnection和NSURLSessionTask 对比
>NSURLConnection 不能挂起,只能开始和取消,一旦取消,如果需要再次启动,需要新建connection
>NSURLSessionTask 可以挂起/继续/取消/完成