NSURLSession基础


1、简介

>iOS7.0推出,用于替代NSURLConnection

> 支持后台运行的网络任务。

> 暂停,停止,重启网络任务,不需要NSOperation封装。

> 请求可以使用同样的 配置容器。

> 不同的session 可以使用不同的私有存储。

>block 和代理可以同时起作用。

> 直接从文件系统上传,下载。

 

2NSURLSession常见代码演练

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

 

3NSURLSession下载文件和解压缩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];

    }

}

 

NSURLConnectionNSURLSessionTask 对比

>NSURLConnection 不能挂起,只能开始和取消,一旦取消,如果需要再次启动,需要新建connection

>NSURLSessionTask 可以挂起/继续/取消/完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值