在移动互联网时代,几乎所有应用都需要用到网络下载,比如图片的加载,音乐的下载,安装包的下载,等等,下面我们来看看如何进行下载

一、文件的下载我们用get来请求数据,并对请求的二进制数据进行解析存入文件,首先我们先引入一个第三方进度条 ,并且进行初始化

- (void)viewDidLoad {
[super viewDidLoad]; //设置背景色
self.view.backgroundColor=[UIColor greenColor]; //引入第三方进度条
self.da=[[DACircularProgressView alloc] initWithFrame:CGRectMake(/2.0-, , , )];
[self.view addSubview:self.da]; }

二、设置文件下载地址,开始下载数据

#pragma mark - 开始下载数据
- (void) start{
//设置网络资源地址
NSString * str=@"http://dl.g.youku.com/20151023/1445588041_20151023XXXX.apk";
NSURL * url=[NSURL URLWithString:str];
NSMutableURLRequest * request=[NSMutableURLRequest requestWithURL:url]; // 设置Range,代表请求的开始位置,刚开始的默认位置为0
[request setValue:[NSString stringWithFormat:@"bytes=%ld-",self.currentLength] forHTTPHeaderField:@"Range"];
//发送请求
self.conn= [NSURLConnection connectionWithRequest:request delegate:self]; }

三、实现代理方法

  在下载的时候我们通常采用可变的NSMutableData来存下载的数据,但是用这种方式会导致内存越来越大,本来手机的内存都是有限的,因此我们需要对其进行优化,防止闪退,解决方式是我们不采用将请求的数据缓存带内存中,而是采取及时下载及时缓存的方式,每次下载都写入文件,代码如下

@interface ViewController ()<NSURLConnectionDataDelegate>

/** 当前下载长度*/
@property(nonatomic,assign) NSInteger currentLength; /** 文件总长度*/
@property(nonatomic,assign) NSInteger totalLength; /** 链接长度*/
@property(nonatomic,strong) NSURLConnection * conn; /** 文件写入句柄*/
@property(nonatomic,strong) NSFileHandle * handle; /** 第三方进度条*/
@property(nonatomic,strong) DACircularProgressView * da;
/** 第三方进度条*/
@property(nonatomic,weak) DPMeterView * dp;
@end #pragma mark - 响应代理方法,在沙盒创建文件和文件句柄
- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ if (self.totalLength<=) {
self.totalLength=response.expectedContentLength;
} //创建文件操作句柄
if (self.handle==nil) { //获取文件路径
NSString *path=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
path=[path stringByAppendingPathComponent:@"jereh.apk"]; //创建管理类
NSFileManager * manager=[NSFileManager defaultManager];
[manager createFileAtPath:path contents:nil attributes:nil]; //初始化管理句柄
self.handle=[NSFileHandle fileHandleForWritingAtPath:path];
} } #pragma mark - 接受数据代理方法,将接受到的数据写入文件,并且计算下载进度
- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ //记录当前长度,算取百分比
self.currentLength+=data.length;
CGFloat percent=self.currentLength*1.0/self.totalLength; //移动到文件末尾
[self.handle seekToEndOfFile]; //将当前数据写入文件
[self.handle writeData:data]; //修改进度条
self.da.progress=percent; }

四、在文件下载时候我们需要暂停功能,如何让一个下载中的请求暂停呢?我们只需要调用取消方法即可

#pragma mark - 设置暂停方法
- (void) pause{
[self.conn cancel];
self.conn=nil;
}

五、最后关闭句柄

#pragma mark - 关闭句柄
-(void)dealloc{ [self.handle closeFile];
}
作者:杰瑞教育
出处:http://www.cnblogs.com/jerehedu/ 
版权声明:本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

技术咨询:
 

IOS中的网络编程的更多相关文章

  1. IOS中的网络编程详解

    在移动互联网时代,几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图,只有通过网络跟外界进行数据交互.数据更新,应用才能保持新鲜.活力,如果没有了网络,也就缺少了数据变化,无论外观多 ...

  2. iOS开发之网络编程--5、NSURLSessionUploadTask+NSURLSessionDataDelegate代理上传

    前言:关于NSURLSession的主要内容快到尾声了,这里就讲讲文件上传.关于文件上传当然就要使用NSURLSessionUploadTask,这里直接讲解常用的会和代理NSURLSessionDa ...

  3. iOS开发之网络编程--4、NSURLSessionDataTask实现文件下载(离线断点续传下载) <进度值显示优化>

    前言:根据前篇<iOS开发之网络编程--2.NSURLSessionDownloadTask文件下载>或者<iOS开发之网络编程--3.NSURLSessionDataTask实现文 ...

  4. iOS开发之网络编程--3、NSURLSessionDataTask实现文件下载(离线断点续传下载)

    前言:使用NSURLSessionDownloadTask满足不这个需要离线断点续传的下载需求,所以这里就需要使用NSURLSessionDataTask的代理方法来处理下载大文件,并且实现离线断点续 ...

  5. iOS开发之网络编程--2、NSURLSessionDownloadTask文件下载

    本文内容大纲: 1.回顾NSURLSessionTask 2.NSURLSessionDownloadTask大文件之block下载 3.NSURLSessionDownloadTask大文件之代理方 ...

  6. iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄

    前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传.    在实际开发中,输入输出流用的比较少,但 ...

  7. iOS开发之网络编程--使用NSURLConnection实现大文件下载

    主要思路(实现下载数据分段写入缓存中) 1.使用NSURLConnectionDataDelegate以及代理方法.2.在成功获取响应的代理方法中,获得沙盒全路径,并在该路径下创建空文件和文件句柄.3 ...

  8. iOS开发之网络编程--小文件下载

    文件下载方式: 如果下载的文件比较小,下载方式: 直接用NSData的 +(id)dataWithContentsOfURL:(NSURL*)url; 利用NSURLConnection发送一个HTT ...

  9. IOS研究之网络编程(二)-Cocoa Streams使用具体解释

     本文以及相关的系列文章是我总结的iOS网络开发方面的知识点,本文是第二篇,主要分析了Cocoa Streams中的几个重要类 Cocoa Streams实际上是Objective-C对CFNet ...

随机推荐

  1. js-DOM-页面元素的兼容性、常用事件、节点

    页面元素的兼容性: 所谓的兼容性指的就是当前浏览器是否支持当前对象的属性或是方法,如果支持就是兼容,如果不支持就是不兼容. 举个例子: /** * 设置页面标签之间的文本内容的兼容性写法 * @par ...

  2. React Native填坑之旅--HTTP请求篇

    如果不能从头到尾的建立一个RN应用,那么RN将失色不少.本以为HTTP请求部分需要使用Native的实现,Android和iOS各回各家,各调各库了.Google了一下之后居然RN可以使用fetch库 ...

  3. html写法对gzip压缩率的影响

    前几天在群里看到小杜分享一篇文章,<html写法对gzip压缩率的影响>,为此我也对这点分析了一下.不知道大家有没有看过这文章,作者是来自微博懒懒交流会,其内容我这里先简述一下. Gzip ...

  4. Android之Inflate()方法用途

    转自:http://blog.csdn.net/andypan1314/article/details/6715928 Inflate()作用就是将xml定义的一个布局找出来,但仅仅是找出来而且隐藏的 ...

  5. 第三天:DOM EventListener 句柄的添加和移除

    1.事件句柄的包含如下两个方法: ps:使用句柄的好处是,修改方法的名称时,不需要改变多处 1.添加一个句柄, 2.添加多个句柄不会覆盖,运行结果:点击“按钮”,弹出框hello,确定后,自动弹出框w ...

  6. 不制作证书是否能加密SQLSERVER与客户端之间传输的数据?

    不制作证书是否能加密SQLSERVER与客户端之间传输的数据? 在做实验之前请先下载network monitor抓包工具 微软官网下载:http://www.microsoft.com/en-us/ ...

  7. 个性二维码开源专题<液化/圆角/效果>

    基础方法: ChangeFillShape //修改填充形状 ChangeFillShape(...) // 摘要: // 修改填充形状 // // 参数: // g: // 图形画板 // // F ...

  8. Dynamic CRM 2013学习笔记(三十五)自定义审批流6 - 审批通过后,再审批 - 二次审批

    最近有个特殊的需求,客户想做二次审批,就是审批通过后,再走一次审批流程.最开始一想,这还不简单,审批通过后,直接把状态改成draft就完了,后来一试,发现一堆问题,比如第一次审批完后,界面是不允许修改 ...

  9. 第十七章:android解析JSON

    一.解析JSON数据: 首先引入包import org.json.JSONObject;(android sdk 14以后应该自带了 ) Android端的程序解析JSON和JSON数组: packa ...

  10. jquery 常用插件

    50款最有用的 jQuery 插件集锦<表单篇> 50款最有用的 jQuery 插件集锦<网页布局篇> 50款最有用的 jQuery 插件集锦<内容滑块篇> 50款 ...