ios7引入了NSURLSession,通过它可以支持后台相关的网络操作的新特性:

1. 后台上传下载;

2.不需要通过nsoperation,直接用nsurlsession的api就可以做到网络操作的暂停和恢复。

3.作为可配置的容器:例如你可以设置http头的一些属性并且保存在session里,不用重复去做配置

4.可以子类化并支持私有配置的session

5.对鉴权的回调做了改进,此前nsurlconnection的鉴权回调无法和请求进行匹配,该回调可能来自任意的请求;而现在每个请求都可以在指定的代理方法

下面我们简单研究一下如何进行下载:

效果图:

主要代码:

1定义几个全局变量

  1. @interface ViewController ()
  2. {
  3. NSURLSessionDownloadTask * _task;
  4. NSData * _data;
  5. NSURLSession * _session;
  6. NSURLRequest * _request;
  7. UIProgressView * _pro;
  8. UIImageView * _imageView;
  9.  
  10. }

2向视图中添加图片进度条

  1. _imageView=[[UIImageView alloc] initWithFrame:CGRectMake(, , , )];
  2.  
  3. _imageView.center=self.view.center;
  4. [self.view addSubview:_imageView];
  5.  
  6. _pro=[[UIProgressView alloc] initWithFrame:CGRectMake(_imageView.frame.origin.x, _imageView.frame.origin.y+, , )];

3 向视图中添加按钮(同样的方式添加三个)

  1. UIButton * button=[[UIButton alloc] initWithFrame:CGRectMake(, _imageView.frame.origin.y++, , )];
  2. button.backgroundColor=[UIColor blueColor];
  3. [button setTitle:@"开始" forState:UIControlStateNormal];
  4. [button addTarget:self action:@selector(ddLoad) forControlEvents:UIControlEventTouchUpInside];
  5. button.layer.borderWidth=;
  6. button.layer.borderColor=[UIColor blueColor].CGColor;
  7. button.layer.cornerRadius=;
  8. [self.view addSubview:button];

4 通过AFNetworkReachabilityManager网络状态监测

  1. - (void) _checkNet{
  2. //开启网络状态监控
  3. [[AFNetworkReachabilityManager sharedManager] startMonitoring];
  4.  
  5. [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
  6.  
  7. if(status==AFNetworkReachabilityStatusReachableViaWiFi){
  8. NSLog(@"当前是wifi");
  9. }
  10. if(status==AFNetworkReachabilityStatusReachableViaWWAN){
  11. NSLog(@"当前是3G");
  12. }
  13. if(status==AFNetworkReachabilityStatusNotReachable){
  14. NSLog(@"当前是没有网络");
  15. }
  16. if(status==AFNetworkReachabilityStatusUnknown){
  17. NSLog(@"当前是未知网络");
  18. }
  19. }];
  20. }

5开始下载

  1. - (void) ddLoad{
  2. NSURLSessionConfiguration * config=[NSURLSessionConfiguration defaultSessionConfiguration];
  3. _session=[NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
  4. //
  5. NSURL *url=[NSURL URLWithString:@src];
  6. _request=[NSURLRequest requestWithURL:url];
  7. _task= [_session downloadTaskWithRequest:_request];
  8.  
  9. NSLog(@"开始加载");
  10. [_task resume];
  11. }

6 设置暂停和回复

  1. - (void) pause{
  2. //暂停
  3. NSLog(@"暂停下载");
  4. [_task cancelByProducingResumeData:^(NSData *resumeData) {
  5. _data=resumeData;
  6. }];
  7. _task=nil;
  8.  
  9. }
  10. - (void) resume{
  11. //恢复
  12. NSLog(@"恢复下载");
  13. if(!_data){
  14. NSURL *url=[NSURL URLWithString:@src];
  15. _request=[NSURLRequest requestWithURL:url];
  16. _task=[_session downloadTaskWithRequest:_request];
  17.  
  18. }else{
  19. _task=[_session downloadTaskWithResumeData:_data];
  20. }
  21. [_task resume];
  22. }

7 代理方法保存下载文件监控下载进度

  1. #pragma mark - delegate
  2. - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{
  3.  
  4. NSURL * url=[NSURL fileURLWithPath:@"/Users/jredu/Desktop/tt.png"];
  5.  
  6. NSFileManager * manager=[NSFileManager defaultManager];
  7.  
  8. [manager moveItemAtURL:location toURL:url error:nil];
  9. dispatch_async(dispatch_get_main_queue(), ^{
  10.  
  11. NSData * data=[manager contentsAtPath:@"/Users/jredu/Desktop/tt.png"];
  12. UIImage * image=[[UIImage alloc ]initWithData:data];
  13. _imageView.image=image;
  14. UIAlertView * alert=[[UIAlertView alloc] initWithTitle:nil message:@"下载完成" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
  15. [alert show];
  16.  
  17. }) ;
  18.  
  19. }
  20.  
  21. - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
  22. didWriteData:(int64_t)bytesWritten
  23. totalBytesWritten:(int64_t)totalBytesWritten
  24. totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{
  25. CGFloat progress=(totalBytesWritten*1.0)/totalBytesExpectedToWrite;
  26. dispatch_async(dispatch_get_main_queue(), ^{
  27. _pro.progress=progress;
  28. }) ;
  29.  
  30. }
作者:杰瑞教育
出处:http://www.cnblogs.com/jerehedu/ 
版权声明:本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

技术咨询:
 

NSURLSession下载的更多相关文章

  1. IOS 网络浅析-(十 NSURLSession下载简介)

    之前本来打算在写两个篇幅,但是在这片开写的时候觉得还是写一个比较好,有利于理解.NSURLSession下载是通过NSURLSession下载代理实现的,上一片也介绍了代理,之所以没有介绍下载是因为, ...

  2. iOS NSURLSession 下载

    周五的时候,有个新的需求,要下载脚本,帮助玩家自动打怪,应该也是挂机的意思吧! 组长让我设计界面,让汤老师设计数据等.我觉得数据的挑战性更大一点,然后就接过来了. 自己还没有形成互联网思维,所以弄了一 ...

  3. 利用NSURLSession下载视频,图片,能实现断点续传

    首先分析下载资源到本地,就得有URL ,点击btn ,就会解析网络地址,获取数据,就得有进度条控件 NSURLSession类的实现,通过委托代理模式去实现一些方法,需遵守<NSURLSessi ...

  4. NSURLSession下载和断点续传

    NSURLSession是iOS7之后新的网络接口,和经常用到NSURLConnection是类似的.在程序在前台时,NSURLSession与NSURLConnection可以相互的替代.但是当用户 ...

  5. NSURLSession下载文件-代理

    - 3.1 涉及知识点(1)创建NSURLSession对象,设置代理(默认配置) ```objc //1.创建NSURLSession,并设置代理 /* 第一个参数:session对象的全局配置设置 ...

  6. iOS 学习 - 10下载(3) NSURLSession 音乐 篇

    使用 NSURLSession 下载,需要注意的是文件下载文件之后会自动保存到一个临时目录,需要开发人员自己将此文件重新放到其他指定的目录中 // // ViewController.m // Web ...

  7. iOS开发——网络Swift篇&NSURLSession加载数据、下载、上传文件

    NSURLSession加载数据.下载.上传文件   NSURLSession类支持三种类型的任务:加载数据.下载和上传.下面通过样例分别进行介绍.   1,使用Data Task加载数据 使用全局的 ...

  8. 使用NSURLSession获取网络数据和下载文件

    使用NSURLSession获取网络数据 使用NSURLSession下载文件

  9. Swift - 使用NSURLSession加载数据、下载、上传文件

    NSURLSession类支持三种类型的任务:加载数据.下载和上传.下面通过样例分别进行介绍. 1,使用Data Task加载数据 使用全局的sharedSession()和dataTaskWithR ...

随机推荐

  1. 8.4 正睿暑期集训营 Day1

    目录 2018.8.4 正睿暑期集训营 Day1 A 数对子 B 逆序对 C 盖房子 考试代码 A B C 2018.8.4 正睿暑期集训营 Day1 时间:4.5h(实际) 期望得分:30+50+3 ...

  2. Android 获取手机信息,设置权限,申请权限,查询联系人,获取手机定位信息

    Android 获取手机信息,设置权限,申请权限,查询联系人,获取手机定位信息 本文目录: 获取手机信息 设置权限 申请权限 查询联系人 获取手机定位信息 调用高德地图,设置显示2个坐标点的位置,以及 ...

  3. AtomicReference,AtomicStampedReference与AtomicMarkableReference的区别

    AtomicReference 通过volatile和Unsafe提供的CAS函数实现原子操作. 自旋+CAS的无锁操作保证共享变量的线程安全 value是volatile类型,这保证了:当某线程修改 ...

  4. 马士兵hadoop第四课:Yarn和Map/Reduce配置启动和原理讲解

    马士兵hadoop第一课:虚拟机搭建和安装hadoop及启动 马士兵hadoop第二课:hdfs集群集中管理和hadoop文件操作 马士兵hadoop第三课:java开发hdfs 马士兵hadoop第 ...

  5. pop3_用Java发送图文并茂的HTML邮件

    package com.syj; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.i ...

  6. SPI SWD Protocol Implement

    //================================================================================= // ARM SWD Mode ...

  7. Revit API取得变量的内参名称

    与取得元素变量的内参名称类别有个BuiltInParameter //取得内参名称 [Transaction(TransactionMode.Manual)] [Regeneration(Regene ...

  8. CTreeCtrl和CListCtrl失去焦点时高亮选中项

    设置CTreeCtrl的Always Show Selection:TrueCListCtrl的Always Show Selection:False在NM_CUSTOMDRAW事件中添加如下代码: ...

  9. delphi 处理缩放图像

    procedure TTMEImageDeviceIdentifyFrom.DrawText(AImage : TImage; AFile: string);var I: Integer; iWidt ...

  10. Delphi数学运算当中四舍五入的问题

    在最近版本的Delphi Pascal 编译器中,Round 函数是以 CPU 的 FPU (浮点部件) 处理器为基础的.这种处理器采用了所谓的 "银行家舍入法",即对中间值 (如 ...