Download类的基本使用
download下载类是系统自带的下载类,它可以将会话对象封装成一个下载任务,它不需要文件句柄也不需要输出流就能实现文件的下载,但它把文件下载结束之后会将文件放在一个temp临时路径里,而且这个路径下的文件会随时被系统删除,因此,为了保证文件的安全性,我们需要手动将下载好的文件移动到安全的路径下。具体代码如下:
-(void)download1{
//创建请求路径
NSURL *url=[NSURL URLWithString:@"http://6:32812/resources/images/minion_01.png"];
//创建请求对象
NSURLRequest *request=[NSURLRequest requestWithURL:url];
//创建会话对象
NSURLSession *session=[NSURLSession sharedSession];
//根据会话对象来创建下载任务
NSURLSessionDownloadTask *downloadTask=[session downloadTaskWithRequest:request completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"%@",location);
//拼接要拷贝到的目的路径,因为数据默认是放在一个临时路径下面,临时路径不安全,因为会随时被删除
NSString *path=[[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:response.suggestedFilename];
NSURL *url=[NSURL fileURLWithPath:path];
//移动文件
[[NSFileManager defaultManager]moveItemAtURL:location toURL:url error:nil];
NSLog(@"%@",url);
}];
//提交任务
[downloadTask resume];
}
除了上面那个方法外,我们还可以通过代理的方法实现,而且使用代理还可以监听文件的下载进度:
-(void)download2{
//确定请求路径
NSURL *url=[NSURL URLWithString:@"http://120.32812/resources/images/minion_01.png"];
//创建请求对象
NSURLRequest *request=[NSURLRequest requestWithURL:url];
//创建会话对象并设置代理
NSURLSession *session=[NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc]init]];
//根据会话对象创建请求任务
NSURLSessionDownloadTask *downloadTask=[session downloadTaskWithRequest:request];
[downloadTask resume];
}
// bytesWritten :本次写入的数据大小 totalBytesWritten:写入的总大小
// totalBytesExpectedToWrite :需要下载的数据的总大小
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite{
//监听文件下载进度
NSLog(@"%f",1.0*totalBytesWritten/totalBytesExpectedToWrite);
}
//下载完成的时候调用
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location{
//剪切文件到安全的位置
NSString *path=[[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:downloadTask.response.suggestedFilename];
NSURL *fullPath=[NSURL fileURLWithPath:path];
[[NSFileManager defaultManager]moveItemAtURL:location toURL:fullPath error:nil];
NSLog(@"%@",fullPath);
}
//请求结束的时候调用(并不是发生错误的时候才调用)
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
NSLog(@"---------");
}