iOS开发--网络下载
这里使用的是NSURLConnection的代理请求下载,并且是具有进度,UI能实时刷新,至于NSURLConnection如何请求、并且有几种请求方法请看NSURLConnection请求简介,在这里的话我们以下载一本书籍为例,下面为它的地址(这是在百度云里面弄的,链接是别人加密了,所有比较长)
http://d.pcs.baidu.com/file/2b66fa1c93d8322d5299a1befc59b16c?fid=204559171-250528-1042286675318370&time=1453435914&rt=sh&sign=FDTAERV-DCb740ccc5511e5e8fedcff06b081203-X%2Bcz8N4IQb25c4wIKAyYl1HHW2M%3D&expires=8h&chkv=1&chkbd=0&chkpc=&dp-logid=498837374116132296&dp-callid=0&r=107651804
代码:
1、首先在storyboard里面拖入一个Progress View(进度条)控件
2、在控制器中拖入Progress View属性,并且另外添加三个属性,如下:
@interface ViewController ()<NSURLConnectionDelegate>
/** 进度条属性*/
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
/** 文件总大小 */
@property (nonatomic, assign) NSUInteger totalLength;
/** 文件当前大小 */
@property (nonatomic, assign) NSUInteger currentLength;
/** 文件路径 */
@property (nonatomic, copy) NSString *path;
@end
3、确定它的URL,以及请求,并且设置它的代理,然后发送所谓的代理请求
- (void)viewDidLoad {
[super viewDidLoad];
//1、确定URL
NSURL *url = [NSURL URLWithString:@"http://d.pcs.baidu.com/file/2b66fa1c93d8322d5299a1befc59b16c?fid=204559171-250528-1042286675318370&time=1453435914&rt=sh&sign=FDTAERV-DCb740ccc5511e5e8fedcff06b081203-X%2Bcz8N4IQb25c4wIKAyYl1HHW2M%3D&expires=8h&chkv=1&chkbd=0&chkpc=&dp-logid=498837374116132296&dp-callid=0&r=107651804"];
//2、创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3、代理请求
/*
第一个参数:请求对象
第二个参数:谁成为代理
第三个参数:startImmediately :是否立即开始发送网络请求
*/
NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];
[connection start];
}
4、在这个Demo中,代理有两个方法是很重要的
4.1、第一个就是刚开始响应的时候,在响应头中,我可以获取文件的预估大小和文件名后缀,用来创建文件夹和记录文件的总大小,用于后面的计算
4.2、第二个就是每次接受到服务器数据的时候,我可以往某个文件写数据,以及计算每次占比例的多少
//1.当接受到服务器响应的时候会调用:response(响应头)
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"接受到响应");
//1、在响应头中有一个预估的文件大小expectedContentLength
self.totalLength = response.expectedContentLength;
//这里你们可以打印看看 然后在网页的请求头也可以去对比一下,看是否为一样
// NSLog(@"totalLength = %lld", response.expectedContentLength);
//2、这里的话为了让性能好一点,我直接在沙盒的Caches中创建一个文件夹直接写的硬盘上,而不是内存中
//2.1、这里是地址为 在沙盒路径的Caches中 添加一个文件名为suggestedFilename的文件,suggestedFilename是响应头中的,也是百度云弄的名字你们也可以打印看看
// NSLog(@"%@",response.suggestedFilename);
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingString:response.suggestedFilename];
//2.2、拿到地址那我们开始创建一个空得文件夹,并且路径给外面的path属性,用于后面拿到位置下载
NSFileManager *manager = [NSFileManager defaultManager];
[manager createFileAtPath:path contents:nil attributes:nil];
self.path = path;
}
//2.当接受到服务器返回数据的时候调用(会调用多次)
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// 1、创建一个操作文件的句柄,并且给予上次的创建文件夹的地址。
NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:self.path];
//设置写入方式,自上次后面写入
[handle seekToEndOfFile];
// 2、利用句柄往文件中写入数据
[handle writeData:data];
// 3、计算当前接收到得数据的总数 这里就是记录每一次写入数据的多少
self.currentLength += data.length;
// 4、计算下载比例
self.progressView.progress = 1.0 * self.currentLength/self.totalLength;
}
//3.当请求失败的时候调用
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"请求失败");
}
//4.当请求结束(成功|失败)的时候调用
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"请求结束");
}
补充
在这个Demo中唯一的优点就是节约了内存,因为每一次写都写到了硬盘中去,而不是内存中,现在你们可以打开你们自己的沙盒里面应该会有一个PDF的文件也就是刚刚下载的,这个Demo中最重要的方法为:
//1.当接受到服务器响应的时候会调用:response(响应头)
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
}
//2.当接受到服务器返回数据的时候调用(会调用多次)
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
}
结束
iOS开发--网络下载的更多相关文章
- iOS开发网络篇—大文件的多线程断点下载
http://www.cnblogs.com/wendingding/p/3947550.html iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时 ...
- iOS开发网络篇—大文件的多线程断点下载(转)
http://www.cnblogs.com/wendingding/p/3947550.html iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了 ...
- iOS开发网络篇—多线程断点下载
iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始, ...
- iOS开发网络篇—数据缓存
iOS开发网络篇—数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造 ...
- iOS开发网络篇—监测网络状态(转)
文章转载自:http://www.cnblogs.com/wendingding/p/3950114.html iOS开发网络篇—监测网络状态 一.说明 在网络应用中,需要对用户设备的网络状态进行实时 ...
- iOS开发网络篇—简单介绍ASI框架的使用
iOS开发网络篇—简单介绍ASI框架的使用 说明:本文主要介绍网络编程中常用框架ASI的简单使用. 一.ASI简单介绍 ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大 ...
- iOS开发网络篇—网络编程基础
iOS开发网络篇—网络编程基础 一.为什么要学习网络编程 1.简单说明 在移动互联网时代,移动应用的特征有: (1)几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图 (2)只有通过 ...
- iOS开发网络篇—搭建本地服务器
iOS开发网络篇—搭建本地服务器 一.简单说明 说明:提前下载好相关软件,且安装目录最好安装在全英文路径下.如果路径有中文名,那么可能会出现一些莫名其妙的问题. 提示:提前准备好的软件 apache- ...
- iOS开发网络篇—监测网络状态
iOS开发网络篇—监测网络状态 一.说明 在网络应用中,需要对用户设备的网络状态进行实时监控,有两个目的: (1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能) (2)根据用户的网络状态进行 ...
随机推荐
- JVM学习---JAVA内存
一.JAVA运行时数据区域:JAVA中的运行时内存区域有的随着虚拟机进程的启动而存在,有的区域则是依赖用户线程的启动和结束而建立和销毁的.包括以下的几个区域. 图. JAVA虚拟机运行时数据区 1.程 ...
- 有趣的checkbox动画切换状态(支付宝转账成功显示)--第三方开源--AnimCheckBox
这个很有趣的指标通过AnimCheckBox实现,下载地址:https://github.com/lguipeng/AnimCheckBox 代码: activity_main.xml: <Re ...
- 小课堂Week11 会说话的代码
小课堂Week11 会说话的代码 今天主要讨论下,在编码过程中和"命名"相关的问题.因为命名方法比较自由,如果要提高可读性,我们需要尽量使其符合正规的英文语法习惯. 变量/属性 通 ...
- Spark菜鸟学习营Day2 分布式系统需求分析
Spark菜鸟学习营Day2 分布式系统需求分析 本分析主要针对从原有代码向Spark的迁移.要注意的是Spark和传统开发有着截然不同的思考思路,所以我们需要首先对原有代码进行需求分析,形成改造思路 ...
- mac os使用homebrew来管理后台服务
在linux下我们经常通过 service 或者 /etc/init.d/来管理我们的后台服务软件,并使用包管理器安装这些软件. 在mac下有homebrew这个好用的工具来安装软件,但是一直没有找到 ...
- 每日一“酷”之copy
Copy – 复制对象 作用:提供一些函数,可以使用浅副本或深副本语义复制对象. copy模块包括两个函数copy()和deepcopy(),用于复制现有的对象 1. 浅副本 copy()创建的浅副 ...
- hdu 5451 Best Solver 矩阵循环群+矩阵快速幂
http://acm.hdu.edu.cn/showproblem.php?pid=5451 题意:给定x 求解 思路: 由斐波那契数列的两种表示方法, 之后可以转化为 线性表示 F[n] = ...
- ios开发--旋转、移动、缩放手势实例代码
代码如下: // 添加所有的手势 - (void) addGestureRecognizerToView:(UIView *)view { // 旋转手势 UIRotationGestureRecog ...
- json 说明书
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Programming Lan ...
- emulatorarm.exe已停止工作
今天使用ADT 打开android模拟器突然发现模拟器报错,[emulatorarm.exe已停止工作],昨天还是好好的,不知道为什么,重建新的模拟器还是这样. 解决办法: 更改ram大小为 512M ...