iOS -- NSURLSession 实现断点下载
NSURLSession是iOS7中新的网络接口,它与咱们熟悉的NSURLConnection是并列的。在程序在前台时,NSURLSession与NSURLConnection可以互为替代工作。注意,如果用户强制将程序关闭,NSURLSession会断掉。
NSURLSession提供的功能:
1.通过URL将数据下载到内存
2.通过URL将数据下载到文件系统
3.将数据上传到指定URL
4.在后台完成上述功能
如果想更深入的了解NSURLSession 请点击 http://www.cocoachina.com/industry/20131106/7304.html
好啦!步入正题,断点下载的实现
控件已经拖好,并且关联了点击事件,下面就是代码部分了。
在viewController.m 文件中声明属性
@property (nonatomic,strong) NSURLSessionDownloadTask *task;
2.创建一个任务配置对象
在viewDidLoad 中写入一下代码
NSURLSessionConfiguration *configer = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configer delegate:self delegateQueue:[NSOperationQueue mainQueue]];
//这里设置代理了,所以需要去遵守两个协议 NSURLSessionDataDelegate,NSURLSessionDelegate
NSURL *url = [NSURL URLWithString:@"http://uploads.mp3songurls.com/2930.mp3"];
//创建下载任务
self.task = [session downloadTaskWithURL:url];
3.下载过程中需要实现代理的方法
#pragma mark 每下载完一部分 就会调用该方法
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didWriteData:(int64_t)bytesWritten
totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
//文件以字节为单位
//1.totalBytesExpectedToWrite 所需下载文件的总大小
//2.totalBytesWritten 已经下载好部分的大小
//3.bytesWritten 当前(本次)下载文件的大小
self.progressView.progress = 1.0f * totalBytesWritten/totalBytesExpectedToWrite;
NSLog(@"%.2f",self.progressView.progress);
}
4.下载完成调用的方法
#pragma mark 下载完成的代理方法
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location
{
//打印一下沙盒地址,去沙盒里面查看下载好的文件
NSLog(@"%@",NSHomeDirectory());
//创建下载文件保存的路径,一般大文件都会保存在cache文件下
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
cachePath = [cachePath stringByAppendingPathComponent:@"111.mp3"];
NSFileManager *manager = [NSFileManager defaultManager];
//将下载好的文件移动到cache文件夹下,因为下载的文件,默认是在tmp目录下,这个目录最大的特点就是,一段时间之后,系统将对该文件下的文件做一个清理的操作,这是自动执行的
[manager moveItemAtPath:location.path toPath:cachePath error:nil];
}
5.开始下载的方法
#pragma mark 开始下载
- (IBAction)startDownloadDidClickedAction:(id)sender {
[self.task resume];
}
6.暂停下载
#pragma mark 暂停下载
- (IBAction)stopButtonDIdClickedAction:(id)sender {
[self.task suspend];
}
这只是做了个小小的介绍,希望对有需要的童鞋有帮助。。。。