NSURLSession是iOS7之后新的网络接口,和经常用到NSURLConnection是类似的。在程序在前台时,NSURLSession与NSURLConnection可以相互的替代。但是当用户在对程序进行强制关闭的时候此时NSURLSession会默认的自动断开。相比而言NSURLSession的优势主要体现在后台操作时候,而且在最流行的框架AFNetworking中也对NSURLSession提供了更好的支持。

  主要提供的功能如下:

1 下载文件到内存中

2 下载文件到路径

3 上传制定的文件等

案例演示:图片下载断点续传

主要代码:

1、定义几个全局变量

@interface ViewController ()
{
NSURLSessionDownloadTask * _task;
NSData * _data;
NSURLSession * _session;
NSURLRequest * _request;
UIProgressView * _pro;
UIImageView * _imageView; }

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

_imageView=[[UIImageView alloc] initWithFrame:CGRectMake(, , , )];

    _imageView.center=self.view.center;
[self.view addSubview:_imageView]; _pro=[[UIProgressView alloc] initWithFrame:CGRectMake(_imageView.frame.origin.x, _imageView.frame.origin.y+, , )];

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

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

4、通过AFNetworkReachabilityManager网络状态监测

- (void) _checkNet{
//开启网络状态监控
[[AFNetworkReachabilityManager sharedManager] startMonitoring]; [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { if(status==AFNetworkReachabilityStatusReachableViaWiFi){
NSLog(@"当前是wifi");
}
if(status==AFNetworkReachabilityStatusReachableViaWWAN){
NSLog(@"当前是3G");
}
if(status==AFNetworkReachabilityStatusNotReachable){
NSLog(@"当前是没有网络");
}
if(status==AFNetworkReachabilityStatusUnknown){
NSLog(@"当前是未知网络");
}
}];
}

5、开始下载

- (void) ddLoad{
NSURLSessionConfiguration * config=[NSURLSessionConfiguration defaultSessionConfiguration];
_session=[NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
//
NSURL *url=[NSURL URLWithString:@src];
_request=[NSURLRequest requestWithURL:url];
_task= [_session downloadTaskWithRequest:_request]; NSLog(@"开始加载");
[_task resume];
}

6、设置暂停和回复

- (void) pause{
//暂停
NSLog(@"暂停下载");
[_task cancelByProducingResumeData:^(NSData *resumeData) {
_data=resumeData;
}];
_task=nil; }
- (void) resume{
//恢复
NSLog(@"恢复下载");
if(!_data){
NSURL *url=[NSURL URLWithString:@src];
_request=[NSURLRequest requestWithURL:url];
_task=[_session downloadTaskWithRequest:_request]; }else{
_task=[_session downloadTaskWithResumeData:_data];
}
[_task resume];
}

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

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

NSURLSession下载和断点续传的更多相关文章

  1. ios 后台下载,断点续传总结

    2018年12月05日 16:09:00 weixin_34101784 阅读数:5 https://blog.csdn.net/weixin_34101784/article/details/875 ...

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

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

  3. Android开发之多线程下载、断点续传、进度条和文本显示

    代码实现了在Android环境下的多线程下载.断点续传.进度条显示和文本显示百分数: import java.io.BufferedReader; import java.io.File; impor ...

  4. Java开发之多线程下载和断点续传

    代码实现了多线程下载和断点续传功能 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream ...

  5. java多线程下载和断点续传

    java多线程下载和断点续传,示例代码只实现了多线程,断点只做了介绍.但是实际测试结果不是很理想,不知道是哪里出了问题.所以贴上来请高手修正. [Java]代码 import java.io.File ...

  6. cocos2d-x 通过socket实现http下载及断点续传的实现

    cocos2d-x 通过socket实现http下载及断点续传的实现 代码未经进一步的整理,可能比较混乱. 首先,2dx的socket库由BSSocket组成.可跨平台,在windows上已验证. 1 ...

  7. Azure存储上传下载(断点续传)

    最近有一个客户需要将文件系统(VM搭建)迁移到Azure存储上,对于Azure存储这里就不多做介绍,但是该客户由于网络原因下载文件的时候经常出现上传中断,所以想在Azure 存储上实现下载的断点续传. ...

  8. AFNetworking 下载文件断点续传操作

    一:本示例代码包括: 文件下载,写入指定目录 下载进度,回调Progress; 断点续传,下载暂停,继续操作: 二:本项目 适用于 AFNetworking 1.x 版本 #pragma mark 断 ...

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

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

随机推荐

  1. 理解URI

    ---恢复内容开始--- 参考 https://zh.wikipedia.org/wiki/%E7%BB%9F%E4%B8%80%E8%B5%84%E6%BA%90%E6%A0%87%E5%BF%97 ...

  2. 每日踩坑 2018-06-19 AutoMapper简单性能测试

    想使用 AutoMapper 类库来做一些映射到 DTO 对象的操作 但既然类似这样的类库内部是用反射来实现的,那么会比较在意性能. 所以来简单测试一下性能. 关于测试结果呢 emmmm 我是比较吃惊 ...

  3. eventbus 视频

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 尚硅谷Android视频<EventBus>_腾讯课堂

  4. BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机 后缀自动机 字符串

    https://www.lydsy.com/JudgeOnline/problem.php?id=3926 广义后缀自动机是一种可以处理好多字符串的一种数据结构(不像后缀自动机只有处理一到两种的时候比 ...

  5. 【SPFA】POJ1511-Invitation Cards

    [题目大意] 给出一张有向图,以1位源点,求“从源点出发到各点的距离”和“与各点返回源点的距离和”相加得到的和. [思路] 毫无疑问是最短路径,但是这数据量就算是SPFA也绝壁会超时啊,抱着必死的心态 ...

  6. bzoj 4033

    树形DP,dp[i][j]表示i子树中,选了j个白点,i子树中所有边的贡献. /************************************************************ ...

  7. Python168的学习笔记7

    关于多线程操作. 对于IO操作,如访问网站,写入磁盘这种需要时间等待响应的操作,多个cpu也几乎不能提高效率. 对于CPU密集型操作,如这个格式转换,可以通过多个cpu同时去进行. 但是对于pytho ...

  8. Codeforces Round 486C - Palindrome Transformation 贪心

    C. Palindrome Transformation time limit per test 1 second memory limit per test 256 megabytes input ...

  9. Qt 4.7.2移植到ARM教程

    Qt的移植包括步骤如下: 1.下载并安装VMware WorkStation 12(最好比较高级的版本,早期的版本共享目录在虚拟机里可能显 示不了). 2.下载ubuntu 14.0.4(最好是lts ...

  10. Linux的本地时间和网络时间同步

    Linux本地时间和网络时间不同步,更新了之后,重启还会变回去.可以通过一下方法修改并保存. 1.  安装ntpdate工具 sudo apt-get install ntpdate 2.  设置系统 ...