//
// ViewController.m
// 大文件的下载
/*
如果文件比较小,下载方式会比较多
直接用NSData的+ (id)dataWithContentsOfURL:(NSURL *)url;
利用NSURLConnection发送一个HTTP请求去下载
如果是下载图片,还可以利用SDWebImage框架
*/
#import "ViewController.h"
@interface ViewController ()<NSURLConnectionDataDelegate>
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
- (IBAction)start;
//写数据的文件句柄
@property(nonatomic,strong)NSFileHandle *writeHandle;
//当前已下载的数据的长度
@property(nonatomic,assign)long long currentLength;
//完整文件的总长度
@property(nonatomic,assign)long long totalLength;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (IBAction)start
{
NSURL *url = [NSURL URLWithString:@"https://localhost/resources/video.zip"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[NSURLConnection connectionWithRequest:request delegate:self];
}
#pragma mark - NSURLConnectionDataDelegate
/**
* 请求失败的时候调用(请求超时、断网、没有网。一般都是客户端错误)
*/
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
}
/**
* 当接受到服务器的响应的就会调用
*/
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
//0.文件存储的路径
NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString *filepath = [caches stringByAppendingPathComponent:@"video.zip"];
//1.创建一个空的文件到沙盒中
NSFileManager *mgr = [NSFileManager defaultManager];
[mgr createFileAtPath:filepath contents:nil attributes:nil];
//2.创建写数据的文件句柄
self.writeHandle = [NSFileHandle fileHandleForWritingAtPath:filepath];
//3.获取完整文件的长度
self.totalLength = response.expectedContentLength;
}
/**
* 当接受到服务器返回的数据就会调用(可能会被调用多次,每次只会传递部分数据)
*/
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
//累计已下载的数据的长度
self.currentLength += data.length;
//显示进度
double progress = (double)self.currentLength / self.totalLength;
self.progressView.progress = progress;
//移到到文件的尾部
[self.writeHandle seekToEndOfFile];
//从当前移动的位置开始写入数据
[self.writeHandle writeData:data];
}
/**
* 当服务器的数据接受完毕后就会调用
*/
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
//清空属性值
self.currentLength = 0;
self.totalLength = 0;
//关闭连接(不再输入数据到文件中)
[self.writeHandle closeFile];
self.writeHandle = nil;
}
@end
大文件的下载(显示进度条)
最新推荐文章于 2024-07-15 11:11:21 发布