NSURLSession基础
2015-12-14 23:00
274 查看
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
发起的,不要通过 allo
ed30
c 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
可以挂起/继续/取消/完成
>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
发起的,不要通过 allo
ed30
c 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
可以挂起/继续/取消/完成
相关文章推荐
- iOS开发UI篇—核心动画(基础动画)
- 数学魔术
- CSS3阴影 box-shadow的使用和技巧总结
- 使用C#连接ORACLE数据库
- 给jdk写注释系列之jdk1.6容器(2)-LinkedList源码解析
- Session 与 Cookie
- Hbase存储详解
- iOS平台下的内存管理和一些内存检测的实用方法
- 海量数据处理
- AdapterView及子类的相关学习整理
- Android笔记:ListView 显示(数据变化后滚动到)最底部。
- vim配置
- AngularJS 指令
- 第三阶段第一天
- void指针类型
- 学习popupmenu
- Java学习笔记(4):2.数组
- 【软件工程】1.软件工程概述
- toggle界面转化(UGUI)
- [LeetCode]Restore IP Addresses