主要是需要注意,在客服端发请求给服务器的时候,在请求头里是可以设置服务器返回的数据从哪开始,到哪结束的.

当服务器响应客户端时,是可以拿到服务器返回数据具体类型以及大小的

思路:

在接收到服务器响应时,创建一个空文件,和一个跟空文件相关联的句柄对象

然后,在接收到服务器返回的数据时,利用句柄对象,移动到文件末尾,将数据拼接到文件末尾

在接受完服务器返回的数据后,关闭句柄

#import <Foundation/Foundation.h>

@interface ZYFileDownLoad : NSObject
//所需要下载文件的远程URL(连接服务器的路径)
@property (nonatomic, strong) NSString *urlStr; //文件的存储路径
@property (nonatomic, strong) NSString *goalPath; //是否正在下载
@property (nonatomic, readonly, getter= isDownLoading) BOOL downLoading; //监听下载进度
@property (nonatomic, copy) void (^progressHandler)(double progress); //下载完成后的回调
@property (nonatomic, copy) void (^finishHandler)(); //下载失败后的回调
@property (nonatomic, copy) void (^failureHandler)(NSError *error); //开始下载
- (void)start; //暂停下载
- (void)pause; @end /*
文件一般保存在下面的地址,Documents路径下的文件需要同步,文件大的话消耗性能,tmp路径下随时会被删除
所以一般保存在Library\Caches路径下 获取此路径:
NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *filepath = [caches stringByAppendingPathComponent:@"文件名.后缀名"];
*/
#import "ZYFileDownLoad.h" @interface ZYFileDownLoad() <NSURLConnectionDataDelegate>
//当前已下载的数据长度
@property (nonatomic, assign) long long currentLength; //连接对象
@property (nonatomic, strong) NSURLConnection *connection; //总的文件长度
@property (nonatomic, assign) long long totalLength; //写入文件句柄
@property (nonatomic, strong) NSFileHandle *writeHandle; @end @implementation ZYFileDownLoad
- (void)start
{
[self.urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:self.urlStr]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; //设置请求头信息,这里表示,此次数据范围是currentProgress 到文件最后(也就是只设置开头从什么地方下载)
NSString *value = [NSString stringWithFormat:@"bytes=%lld-",self.currentLength];
[request setValue:value forHTTPHeaderField:@"Range"]; self.connection = [NSURLConnection connectionWithRequest:request delegate:self]; _downLoading = YES;
} - (void)pause
{
[self.connection cancel];
self.connection = nil;
_downLoading = NO;
} #pragma mark ----NSURLConnectionDataDelegate //请求错误(失败)的时候调用
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
if (self.failureHandler) {
self.failureHandler(error);
}
} - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
if (self.totalLength) return; //当已经回复过响应了,就无需再次回复(主要用于暂停下载,再回复下载操作) //创建一个空的文件到沙盒中
NSFileManager *manager = [NSFileManager defaultManager];
[manager createFileAtPath:self.goalPath contents:nil attributes:nil]; ////创建写数据的文件句柄
self.writeHandle = [NSFileHandle fileHandleForWritingAtPath:self.goalPath]; //获得完整文件的长度(服务器响应客户端时,会返回具体具体的文件长度)
self.totalLength = response.expectedContentLength;
} //当接受到服务器的数据就会调用(可能会被调用多次, 每次调用只会传递部分数据)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
self.currentLength += [data length]; //下载完成,累加长度 //进度
double progress = (double)self.currentLength / self.totalLength; //通过block回调,可以执行block里面的操作
if (self.progressHandler) {
self.progressHandler(progress);
} //移动文件尾部,往尾部追加数据
[self.writeHandle seekToEndOfFile];
[self.writeHandle writeData:data];
} - (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
//下载完毕,请客属性
self.currentLength = 0;
self.totalLength = 0; if (self.currentLength == self.totalLength) {
//下载完毕,关闭连接
[self.writeHandle closeFile];
self.writeHandle = nil;
} if (self.finishHandler) {
self.finishHandler();
}
}
@end

iOS中大文件下载(单线程下载)的更多相关文章

  1. 【Java EE 学习 22 下】【单线程下载】【单线程断点下载】【多线程下载】

    一.文件下载简述 1.使用浏览器从网页上下载文件,Servlet需要增加一些响应头信息 (1)response.setContentType("application/force-downl ...

  2. ios的网络数据下载和json解析

    ios的网络数据下载和json解析 简介 在本文中,笔者将要给大家介绍如何使用nsurlconnection 从网上下载数据,以及解析json数据格式,以及如何显示数据和图片的异步下载显示. 涉及的知 ...

  3. IOS开发-第三方SDWebImage下载网络图片的使用

    从网络上请求图片时,没有使用第三方的话,下载会很慢,而且堵塞线程,还要自己处理多线程问题,效果还非常不明显,使用了SDWebImage这个第三方类库之后,下载图片就变的容易多了. SDWebImage ...

  4. ios背景更新和下载

    ios背景更新和下载 by 吴雪莹 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NS ...

  5. iOS之网络数据下载和JSON解析

    iOS之网络数据下载和JSON解析 简介 在本文中笔者将要给大家介绍IOS中如何利用NSURLconnection从网络上下载数据以及如何解析下载下来的JSON数据格式,以及如何显示数据和托图片的异步 ...

  6. vue打包app嵌入h5,区分app进入和android,ios显示不同的下载链接

    vue打包app嵌入h5,区分app进入和android,ios显示不同的下载链接 需求:自己app打开的登录页面不显示app下载链接.其他地方打开判断android手机的跳转到android下载页链 ...

  7. xkcd 单线程下载图片

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  8. urlretrieve 如何给文件下载设置下载进度?

    #python #xiaodeng #如何给文件下载设置下载进度? import urllib def callbackinfo(down,block,size): ''' 回调函数: down:已经 ...

  9. iOS 开发工具网页下载

    iOS 开发工具网页下载地址: https://developer.apple.com/downloads/

随机推荐

  1. Zabbix触发器支持的函数说明

    原文出处:https://www.zabbix.com/documentation/2.0/manual/appendix/triggers/functions 译者: pengyao abschan ...

  2. html5界面手机播放mp3

    1把这段代码复制到htm5界面. <audio id="audio" src="2.mp3" style="opacity:0" pr ...

  3. C++下的命名空间

    转自:http://blog.chinaunix.net/uid-24219701-id-2105573.html 实例: #include <iostream> using namesp ...

  4. io分析神器blktrace

    一.概述 [许久之前就用过blktrace,现整理如下] 从linux 一个完整的IO入手分析: 一个I/O请求进入block layer之后,可能会经历下面的过程: Remap: 可能被DM(Dev ...

  5. Unicode和UTF的关系

    目录结构: contents structure [+] 什么是USC UCS的编码方式 Unicode的来源 为什么需要Unicode Unicode的方式 Unicode和UTF UTF和Unic ...

  6. 一些实用的php库

    Idiorm – 轻量级ORM库 Snappy – 快照/PDF库 Buzz – 简单的HTTP请求库 Omnipay – 支付处理库 ShellWrap – 优美的命令行包装器

  7. 【转】我离开了 Coverity

    我离开了 Coverity 在写这篇博文的时候,我已经不再是 Coverity 的员工了,我已经在今天下午向公司正式辞职. 走出公司的大门,我觉得一身的轻松.这是我几个月以来第一次感受到加州美丽的阳光 ...

  8. Shell脚本:向磁盘中批量写入数据

    一.关于本文 工作要做的监控系统需要监控磁盘空间的使用率并报警.在测试这个功能的时候需要模拟两个场景:一是磁盘空间不断增长超过设定的阈值时,需要触发报警机制:二是磁盘空间降落到低于报警阈值的时候,不再 ...

  9. ekho安装及测试(中文文字转语音)

    1. 官网下载源码包 地址:http://www.eguidedog.net/ekho.php 2. 安装 xz -d ekho-7.5.tar.xz tar -xvf ekho-7.5.tar ap ...

  10. 为什么推荐你用 Kotlin语言?

    谷歌大牛说:为什么 Kotlin 比你们用的那些垃圾语言都好 原标题:谷歌大牛说:为什么 Kotlin 比你们用的那些垃圾语言都好 编译:伯乐在线/黄小非 [伯乐在线/程序员的那些事 导读]:5月18 ...