下载文件到NSURLConnection与NSURLSession两种,一种有恨悠久的历史了。

使用相对麻烦,后者是新出来的,添加了一些额外的功能。

一、NSURLConnection实现下载

TIPS:

1、当NSURLConnection下载时,得到的NSData写入文件时,data并没有占用多大内存. (即使文件非常大)
2、一点点在传. 做的是磁盘缓存.而不是内存缓存机制。

3、了解在NSURLConnection上加代理。

[consetDelegateQueue:[[NSOperationQueuealloc]init]]

4、NSURLResponse记录的了url, mineType, exceptedContentLength, suggestedFileName等属性.
下载时用得着.  

下面程序实现追踪下载百分比的下载(URLConnection自带的方法):

#import "XNDownload.h"

typedef void(^ProgressBlock)(float percent);

@interface XNDownload() <NSURLConnectionDataDelegate>

@property (nonatomic, strong) NSMutableData *dataM;

// 保存在沙盒中的文件路径
@property (nonatomic, strong) NSString *cachePath;
// 文件总长度
@property (nonatomic, assign) long long fileLength;
// 当前下载的文件长度
@property (nonatomic, assign) long long currentLength; // 回调块代码
@property (nonatomic, copy) ProgressBlock progress; @end @implementation XNDownload - (NSMutableData *)dataM
{
if (!_dataM) {
_dataM = [NSMutableData data];
}
return _dataM;
} - (void)downloadWithURL:(NSURL *)url progress:(void (^)(float))progress
{
// 0. 记录块代码
self.progress = progress; // 1. request GET
NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 2. connection
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; // 让connection支持多线程。指定代理的工作队列就可以
// NSURLConnection在执行时,执行循环不负责监听代理的详细执行
[connection setDelegateQueue:[[NSOperationQueue alloc] init]]; // 3. 启动连接
[connection start];
} #pragma mark - 代理方法
// 1. 接收到server的响应。server执行完请求,向client回传数据
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"%@ %lld", response.suggestedFilename, response.expectedContentLength);
// 1. 保存的缓存路径
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
self.cachePath = [cachePath stringByAppendingPathComponent:response.suggestedFilename];
// 2. 文件总长度
self.fileLength = response.expectedContentLength;
// 3. 当前下载的文件长度
self.currentLength = 0; // 清空数据
[self.dataM setData:nil];
} // 2. 接收数据。从server接收到数据
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// 拼接数据
[self.dataM appendData:data]; // 依据data的长度添加当前下载的文件长度
self.currentLength += data.length; float progress = (float)self.currentLength / self.fileLength; // 推断是否定义了块代码
if (self.progress) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// 强制执行循环执行一次更新
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate date]]; self.progress(progress);
}];
}
} // 3. 完毕接收
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"%s %@", __func__, [NSThread currentThread]);
// 将dataM写入沙盒的缓存文件夹
// 写入数据,NSURLConnection底层实现是用磁盘做的缓存
[self.dataM writeToFile:self.cachePath atomically:YES];
} // 4. 出现错误
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"%@", error.localizedDescription);
} @end

二、NSURLSession实现下载

NSURLSession能实现断点续传,暂停下载等功能。

1、session提供的是开了多个线程的异步下载.
2、下载的暂停与续传: (session的代理中的方法)
*弄一个NSData变量来保存下载东西.暂停时将下载任务task清空.
*续传:将暂停时的data交给session继续下载,并将先前的data清空.
3、task一定要resume才開始运行.
#import "XNViewController.h"

@interface XNViewController () <NSURLSessionDownloadDelegate>

// 下载网络回话
@property (nonatomic, strong) NSURLSession *session;
// 下载任务
@property (nonatomic, strong) NSURLSessionDownloadTask *downloadTask;
// 续传的二进制数据
@property (nonatomic, strong) NSData *resumeData;
@end @implementation XNViewController - (NSURLSession *)session
{
if (!_session) {
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
_session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
}
return _session;
} - (void)viewDidLoad
{
[super viewDidLoad]; [self downloadFile];
} // 暂停下载任务
- (IBAction)pause
{
// 假设下载任务不存在,直接返回
if (self.downloadTask == nil) return; // 暂停任务(块代码中的resumeData就是当前正在下载的二进制数据)
// 停止下载任务时,须要保存数据
[self.downloadTask cancelByProducingResumeData:^(NSData *resumeData) {
self.resumeData = resumeData; // 清空而且释放当前的下载任务
self.downloadTask = nil;
}];
} - (IBAction)resume
{
// 要续传的数据是否存在?
if (self.resumeData == nil) return; // 建立续传的下载任务
self.downloadTask = [self.session downloadTaskWithResumeData:self.resumeData];
[self.downloadTask resume]; // 将此前记录的续传数据清空
self.resumeData = nil;
} // 假设在开发中使用到缓存文件夹,一定要提供一个功能,“清除缓存”。
/** 下载文件 */
- (void)downloadFile
{
NSString *urlStr = @"http://localhost/苍老师全集.rmvb";
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:urlStr]; // (1) 代理 & 直接启动任
// 2. 启动下载任务
self.downloadTask = [self.session downloadTaskWithURL:url]; [self.downloadTask resume];
} #pragma mark - 下载代理方法
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
NSLog(@"完毕 %@ %@", location, [NSThread currentThread]);
} /**
bytesWritten : 本次下载的字节数
totalBytesWritten : 已经下载的字节数
totalBytesExpectedToWrite : 下载总大小
*/
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
float progress = (float)totalBytesWritten / totalBytesExpectedToWrite; [[NSOperationQueue mainQueue] addOperationWithBlock:^{
//主线程中更新进度UI操作。。。。
}];
} /** 续传的代理方法 */
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
{
NSLog(@"offset : %lld", fileOffset);
} @end

出处:http://blog.csdn.net/xn4545945

版权声明:本文博主原创文章。博客,未经同意不得转载。

【iOS】文件下载小记的更多相关文章

  1. iOS 文件下载

    iOS 视频音乐类等应用会用到“文件下载”.文件下载在iOS中的实现如下: 1.小文件下载 @interface ViewController () <NSURLConnectionDataDe ...

  2. IOS知识小记

    iOS开发 小知识点 http://www.cnblogs.com/tangbinblog/archive/2012/07/20/2601324.html Objective-C中的instancet ...

  3. iOS 文件下载及断点续传

    ios的下载我们可以使用的方法有:NSData.NSURLConnection.NSURLSession还有第三方框架AFNetworking和ASI 利用NSData方法和NSURLConnecti ...

  4. 【转】iOS 文件下载及断点续传

    ios的下载我们可以使用的方法有:NSData.NSURLConnection.NSURLSession还有第三方框架AFNetworking和ASI 利用NSData方法和NSURLConnecti ...

  5. IOS开发小记-内存管理

    关于IOS开发的内存管理的文章已经很多了,因此系统的知识点就不写了,这里我写点平时工作遇到的疑问以及解答做个总结吧,相信也会有人遇到相同的疑问呢,欢迎学习IOS的朋友请加ios技术交流群:190956 ...

  6. iOS 文件下载和打开

    最近的项目要用到一个在线报告的下载,于是完成后自己在理一下思路,大体的实现了我要得需求. 话不多说,直接上代码 首先,取到网络文件的链接,进行判段是否需求再次下载还是直接打开 #pragma mark ...

  7. ios碎片小记

    一.UIImageView 1.图片形状设为圆形时可能会由于图片的宽高比例导致显示出来的效果不是圆形 解决:设置UIImageView的contentMode为UIViewContentModeSca ...

  8. IOS文件下载

    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask, ...

  9. iOS - NetRequest 网络数据请求

    1.网络请求 1.1 网络通讯三要素 1.IP 地址(主机名): 网络中设备的唯一标示.不易记忆,可以用主机名(域名). 1) IP V4: 0~255.0~255.0~255.0~255 ,共有 2 ...

随机推荐

  1. Qt调用摄像头(截取并保存图片)

    原地址:http://blog.csdn.net/liang19890820/article/details/12782531 Qt如何调用系统摄像设备进行显示.截图.录制?     QCamera: ...

  2. PHP学习之-正则表达式

    PHP学习之-正则表达式 1.什么是正则表达式 正则表达式是对字符串处理额一种逻辑公式,就是用特定的字符串组合成一个规则的字符串,称之为正则匹配模式 $p = '/apple/'; $str = '' ...

  3. 深入浅出Hive企业级架构优化、Hive Sql优化、压缩和分布式缓存(企业Hadoop应用核心产品)

    一.本课程是怎么样的一门课程(全面介绍)    1.1.课程的背景       作为企业Hadoop应用的核心产品,Hive承载着FaceBook.淘宝等大佬 95%以上的离线统计,很多企业里的离线统 ...

  4. 基于visual Studio2013解决C语言竞赛题之1060寻找回文数

       题目 解决代码及点评 /* 60. 回文数指左右数字对称的数,如121,2112都是回文数.回文数猜想:取一任意十进制数,将其倒过来,并将这两个数相加, 然后把这个相加的和倒过来再与 ...

  5. Linux/ubuntu下的boost库安装

    我一直都没有写博客的习惯,最近正好在研究linux下的开发(目前也只是粗粗的研究),且用到了boost库,就乘此机会写点什么,最起码记录一下我在安装boost的一些步骤,主要给和我一样的linux开发 ...

  6. [置顶] C++之TinyXML的使用介绍

    一.引子: 最近在做GBT28181国标平台对接的工作,涉及到一些进程间消息通讯,消息体有xml格式,之前测试的时候都是拿他们当做字符串去解析,现在正儿八经地开发的时候,就想到了用xml库去解析,由于 ...

  7. Swift - 使用相机拍摄照片

    1,打开相机拍照 通过设置图片控制器UIImagePickerController的来源为UIImagePickerControllerSourceType.Camera,便可以打开相机 1 2 3 ...

  8. hadoop学习;hadoop伪分布搭建

    先前已经做了准备工作安装jdk什么的,以下開始ssh免password登陆.这里我们用的是PieTTY工具,当然你也能够直接在linux下直接操作 ssh(secure shell),运行命令 ssh ...

  9. eval 捕获错误

    eval 捕获错误: [root@dr-mysql01 ~]# cat t1.pl use DBI; my $dbUser='zabbix'; my $user="root"; m ...

  10. App 运营 推广相关

    基本要素 1.定位和产品 2.取个好名字,一目了然+下载冲动 3.设计一个好图标,有感性和直观的认识 4.做好产品的说明.关键字,截图(前1-2行是重点) 5.做市场的排名(相关因素如下)   (1) ...