NSURLSession下载和断点续传
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下载和断点续传的更多相关文章
- ios 后台下载,断点续传总结
2018年12月05日 16:09:00 weixin_34101784 阅读数:5 https://blog.csdn.net/weixin_34101784/article/details/875 ...
- IOS 网络浅析-(十 NSURLSession下载简介)
之前本来打算在写两个篇幅,但是在这片开写的时候觉得还是写一个比较好,有利于理解.NSURLSession下载是通过NSURLSession下载代理实现的,上一片也介绍了代理,之所以没有介绍下载是因为, ...
- Android开发之多线程下载、断点续传、进度条和文本显示
代码实现了在Android环境下的多线程下载.断点续传.进度条显示和文本显示百分数: import java.io.BufferedReader; import java.io.File; impor ...
- Java开发之多线程下载和断点续传
代码实现了多线程下载和断点续传功能 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream ...
- java多线程下载和断点续传
java多线程下载和断点续传,示例代码只实现了多线程,断点只做了介绍.但是实际测试结果不是很理想,不知道是哪里出了问题.所以贴上来请高手修正. [Java]代码 import java.io.File ...
- cocos2d-x 通过socket实现http下载及断点续传的实现
cocos2d-x 通过socket实现http下载及断点续传的实现 代码未经进一步的整理,可能比较混乱. 首先,2dx的socket库由BSSocket组成.可跨平台,在windows上已验证. 1 ...
- Azure存储上传下载(断点续传)
最近有一个客户需要将文件系统(VM搭建)迁移到Azure存储上,对于Azure存储这里就不多做介绍,但是该客户由于网络原因下载文件的时候经常出现上传中断,所以想在Azure 存储上实现下载的断点续传. ...
- AFNetworking 下载文件断点续传操作
一:本示例代码包括: 文件下载,写入指定目录 下载进度,回调Progress; 断点续传,下载暂停,继续操作: 二:本项目 适用于 AFNetworking 1.x 版本 #pragma mark 断 ...
- 利用NSURLSession下载视频,图片,能实现断点续传
首先分析下载资源到本地,就得有URL ,点击btn ,就会解析网络地址,获取数据,就得有进度条控件 NSURLSession类的实现,通过委托代理模式去实现一些方法,需遵守<NSURLSessi ...
随机推荐
- 订单超时、活动过期解决方案:php监听redis key失效触发回调事件
Redis 的 2.8.0 版本之后可用,键空间消息(Redis Keyspace Notifications),配合 2.0.0 版本之后的 SUBSCRIBE 就能完成这个定时任务的操作了,定时的 ...
- codevs 1005 生日礼物
1005 生日礼物 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 9月12日是小松的朋友小寒的生日.小松知 ...
- NOI.AC WC模拟赛
4C(容斥) http://noi.ac/contest/56/problem/25 同时交换一行或一列对答案显然没有影响,于是将行列均从大到小排序,每次处理限制相同的一段行列(呈一个L形). 问题变 ...
- HDU 3949 XOR 线性基
http://acm.hdu.edu.cn/showproblem.php?pid=3949 求异或第k小,结论是第k小就是 k二进制的第i位为1就把i位的线性基异或上去. 但是这道题和上一道线性基不 ...
- PAT(Basic Level)--个位数统计
输入一个不超过1000位的整数,计算每个数字出现的次数. 一道十分简单的题目,最开始以为Java的String没有计算长度的方法,还想了半天,而且还用HashMap做了一次,代码特别长,看了别人的代码 ...
- hdu 1116 并查集判断欧拉回路通路
判断一些字符串能首尾相连连在一起 并查集求欧拉回路和通路 Sample Input 3 2 acm ibm 3 acm malform mouse 2 ok ok Sample Output The ...
- Codeforces Round #361 (Div. 2) D. Friends and Subsequences 二分
D. Friends and Subsequences 题目连接: http://www.codeforces.com/contest/689/problem/D Description Mike a ...
- Codeforces Round #234 (Div. 2) B. Inna and New Matrix of Candies SET的妙用
B. Inna and New Matrix of Candies time limit per test 1 second memory limit per test 256 megabytes i ...
- wikioi 1068 乌龟棋
四维dp表示分别用了多少张卡后可以获得的最大分数 #include <cstdio> #include <cmath> #include <cstring> #in ...
- javascript小记-作用域
一.全局作用域 全局作用域的变量不论在什么时候都可以直接引用,而不必通过全局对象:满足以下条件的变量属于全局作用域:1.在最外层定义的变量2.全局对象的属性3.任何地方隐式定义的变量(未定义直接赋值的 ...