iOS中大文件下载(单线程下载)

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

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

#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
时间: 2024-10-11 11:42:08

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

iOS网络-文件下载,断点下载,输出流下载

小文件下载 NSURLConnection-delegate实现,可以监听到下载的进度,但是还是无法解决内存飙升的问题,所以仅限小文件下载 1 @interface ViewController ()<NSURLConnectionDataDelegate> 2 @property (weak, nonatomic) IBOutlet UIProgressView *progressView; 3 /** 接收数据的data */ 4 @property (nonatomic, strong)

【Java EE 学习第22天 文件下载】【单线程下载】【单线程断点下载】【多线程下载】

一.文件下载简述 1.使用浏览器从网页上下载文件,Servlet需要增加一些响应头信息 (1)response.setContentType("application/force-download"); (2)response.setContentLength(fis.available()); (3)response.setHeader("Content-Disposition","attachment;filename="+filename)

iOS中 流媒体播放和下载 韩俊强的博客

每日更新关注:http://weibo.com/hanjunqiang  新浪微博 iOS中关于流媒体的简介:介于下载本地播放与实时流媒体之间的一种播放形式,下载本地播放必须全部将文件下载完成后才能播放,而渐进式下载不必等到全部下载完成后再播放,它可以一边下载一边播放,在完成播放内容之后,整个文件会保存在手机上. 实时流媒体 实时流媒体是一边接收数据包一边播放,本地不保留文件副本,实时流式传输总是实时传送,可以实时实况转播,支持随机访问,用户可以快进或者快退以观看前面或后面的内容.实时流媒体传输

【iOS】文件下载小记

文件的下载分为NSURLConnection与NSURLSession两种,前一种有恨悠久的历史了.使用相对麻烦,后者是新出来的,增加了一些额外的功能. 一.NSURLConnection实现下载 TIPS: 1.当NSURLConnection下载时,得到的NSData写入文件时,data并没有占用多大内存. (即使文件很大) 2.一点点在传. 做的是磁盘缓存.而不是内存缓存机制. 3.了解在NSURLConnection上加代理.[consetDelegateQueue:[[NSOperat

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

iOS之网络数据下载和JSON解析 简介 在本文中笔者主要给大家介绍IOS如何利用NSURLConnection从网络上下载数据,如何解析下载下来的JSON数据格式,以及如何显示数据和图片的异步下载显示. 涉及到的知识点: 1.NSURLConnection 异步下载和封装 2.JSON格式和JSON格式解析 3.数据显示和使用SDWebImage异步显示图片 内容 1.网络下载基础知识介绍 什么是网络应用? 需要通过联网进行操作的应用 网络应用的程序结构? c/s结构:即客户端/服务端 常见的

Android客户端单线程下载

具体效果如上图所示,具体操作步骤如: 1.先新建一个工程名为getDataInternet的应用: 2.修改res/values中的string.xml文件,具体代码如下: 1 <?xml version="1.0" encoding="utf-8"?> 2 <resources> 3 4 <string name="app_name">Android客户端单线程下载</string> 5 <

iOS之网络数据下载和Json数据解析

iOS之网络数据下载和Json数据解析 简介 在本文中笔者将要给大家介绍iOS中如何利用NSURLConnection从网络上下载数据,如何解析下载下来的JSON数据,以及如何显示数据和图片的异步下载显示 涉及到的知识点: 1.NSURLConnection异步下载封装 2.JSON格式和JSON格式解析 3.数据显示和使用SDWebImage异步显示图片 内容 1.网络下载基础知识介绍 (1)什么是网络应用? 一般情况下, iPhone的计算机, 照相机不需要从网络上下载数据也能运行, 所以这

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

从网络上请求图片时,没有使用第三方的话,下载会很慢,而且堵塞线程,还要自己处理多线程问题,效果还非常不明显,使用了SDWebImage这个第三方类库之后,下载图片就变的容易多了. SDWebImage这个类库提供一个UIImageView类别以支持加载来自网络的远程图片.具有缓存管理.异步下载.同一个URL下载次数控制和优化等特征 利用CocoaPods安装SDWebImage 在profile里放入pod 'SDWebImage', '~> 3.7.3'保存,pod isntall安装,完成后

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

#python #xiaodeng #如何给文件下载设置下载进度? import urllib def callbackinfo(down,block,size): ''' 回调函数: down:已经下载的数据块 block:数据块的大小 size:远程文件的大小 ''' per=100.0*(down*block)/size if per>100: per=100 print '%.2f%%'%per url='http://www.sina.com.cn' local='sina.html'