您的位置:首页 > 其它

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
可以挂起/继续/取消/完成
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: