iOS中利用NSURLSession进行文件断点下载
2015-08-14 11:17
597 查看
我们有时在边聊天边下载大文件时,感觉很卡,这时可以暂停下载任务,聊完天再继续下载文件。这就是断点下载。iOS中利用NSURLSession可以进行文件断点下载,下面就一起来实现它把!!
第一部分
知识储备
1.对NSURLSesiion的认识
NSURLSesiion是苹果在iOS7推出的一个类,它具备了NSURLConnection所具备的方法,同时也比它更强大。苹果推出它的目的大有取代NSURLConnection的趋势或者目的。
2. NSURLSesiion的作用
实现对文件的下载与上传。在NSURLSesiion中,任何请求都可以被看做是一个任务。而NSURLSesiionData 有两个子类:NSURLSessionDownlaodTask实现文件下载和NSURLSessionUploadTask实现文件上传。
3.NSURLSession的获取
NSURLSession的获取可以用NSURLSessionDownloadTaskdelegate的方法获取,但是必须得遵循这个协议。获取如下:
NSURLSessionDonfiguration* configuration=[NSURLSessionDonfiguration defaultSessionconfiguration];
self.session=[NsURLSession sessionWithConfiguration:NSURLSessionDonfiguration delegate: self delegateQueue:[NSOperationQueue mainQueue]];
4.下载任务的创建
NSURLSessionDownlaodTask* task=[self.session downloadTaskWithURL:url]
5.NSURLSessionTaskdelegate的代理方法:
它有三个方法:
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214839_409.png)
6. 沙盒路径的获取
NSString *path=[NSSearchPathForDiretoriesInDomains(NSDocumentDirectoriy, NSUserDomainMask, YES ) lastObject];
7.caches路径的获取及里面文件名的创建
NSString *caches=[NSSearchPathForDiretoriesInDomains(NSCachesDirectoriy, NSUserDomainMask, YES ) lastObject];
NSString* filename=[caches stringByAppendingPathComponent:downloadTask.response.suggestedname];
第二部分 对程序几个属性的说明
1. resumeData
该参数包含了继续下载文件的位置信息。也就是说,当你下载了10M得文件数据,暂停了。那么你下次继续下载的时候是从第10M这个位置开始的,而不是从文件最开始的位置开始下载。因而为了保存这些信息,所以才定义了这个NSData类型的这个属性:resumeData
2. task
该参数的类型是NSURLSessionDownloadTask。因为在程序调用暂停(pause)这个方法时,必须拥有这个属性,怎么拿到它了?最好的办法就是让控制器拥有这个属性。
3. session
该参数的类型是NSURLSession.在程序调用继续下载(resume)这个方法时,必须拥有这个session。因为之前的任务task被取消 了,无法在复用了,所以用懒加载的方法,让session只创建一次,同时也让控制器拥有了这个属性。
第三部分 程序实现流程(伪代码)
下面是文件下载的思路:
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214839_347.png)
第四部分 UI界面搭建
由于程序UI界面搭建十分容易,故在此不详细叙述。
第五部分 程序特别注意点
1. 在调用pause这个方法时,存在着一定的风险,因为self对task进行了强引用,task又对block进行了引用,block又对self进行引用,这就形成了循环使用。怎么解决这个问题呢?
解决方法:对self进行弱引用 __weak typedef(self) vc=self
2. 如果设置了completion和block,又实现了代理方法,程序优先执行block
第六部分 代码截图
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214840_66.png)
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214840_370.png)
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214840_761.png)
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214840_236.png)
第七部分 程序截图
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214840_831.png)
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214841_449.png)
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214841_125.png)
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214841_960.png)
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214841_485.png)
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214841_791.png)
第一部分
知识储备
1.对NSURLSesiion的认识
NSURLSesiion是苹果在iOS7推出的一个类,它具备了NSURLConnection所具备的方法,同时也比它更强大。苹果推出它的目的大有取代NSURLConnection的趋势或者目的。
2. NSURLSesiion的作用
实现对文件的下载与上传。在NSURLSesiion中,任何请求都可以被看做是一个任务。而NSURLSesiionData 有两个子类:NSURLSessionDownlaodTask实现文件下载和NSURLSessionUploadTask实现文件上传。
3.NSURLSession的获取
NSURLSession的获取可以用NSURLSessionDownloadTaskdelegate的方法获取,但是必须得遵循这个协议。获取如下:
NSURLSessionDonfiguration* configuration=[NSURLSessionDonfiguration defaultSessionconfiguration];
self.session=[NsURLSession sessionWithConfiguration:NSURLSessionDonfiguration delegate: self delegateQueue:[NSOperationQueue mainQueue]];
4.下载任务的创建
NSURLSessionDownlaodTask* task=[self.session downloadTaskWithURL:url]
5.NSURLSessionTaskdelegate的代理方法:
它有三个方法:
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214839_409.png)
6. 沙盒路径的获取
NSString *path=[NSSearchPathForDiretoriesInDomains(NSDocumentDirectoriy, NSUserDomainMask, YES ) lastObject];
7.caches路径的获取及里面文件名的创建
NSString *caches=[NSSearchPathForDiretoriesInDomains(NSCachesDirectoriy, NSUserDomainMask, YES ) lastObject];
NSString* filename=[caches stringByAppendingPathComponent:downloadTask.response.suggestedname];
第二部分 对程序几个属性的说明
1. resumeData
该参数包含了继续下载文件的位置信息。也就是说,当你下载了10M得文件数据,暂停了。那么你下次继续下载的时候是从第10M这个位置开始的,而不是从文件最开始的位置开始下载。因而为了保存这些信息,所以才定义了这个NSData类型的这个属性:resumeData
2. task
该参数的类型是NSURLSessionDownloadTask。因为在程序调用暂停(pause)这个方法时,必须拥有这个属性,怎么拿到它了?最好的办法就是让控制器拥有这个属性。
3. session
该参数的类型是NSURLSession.在程序调用继续下载(resume)这个方法时,必须拥有这个session。因为之前的任务task被取消 了,无法在复用了,所以用懒加载的方法,让session只创建一次,同时也让控制器拥有了这个属性。
第三部分 程序实现流程(伪代码)
下面是文件下载的思路:
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214839_347.png)
第四部分 UI界面搭建
由于程序UI界面搭建十分容易,故在此不详细叙述。
第五部分 程序特别注意点
1. 在调用pause这个方法时,存在着一定的风险,因为self对task进行了强引用,task又对block进行了引用,block又对self进行引用,这就形成了循环使用。怎么解决这个问题呢?
解决方法:对self进行弱引用 __weak typedef(self) vc=self
2. 如果设置了completion和block,又实现了代理方法,程序优先执行block
第六部分 代码截图
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214840_66.png)
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214840_370.png)
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214840_761.png)
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214840_236.png)
第七部分 程序截图
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214840_831.png)
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214841_449.png)
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214841_125.png)
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214841_960.png)
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214841_485.png)
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214841_791.png)
![](http://static.open-open.com/lib/uploadImg/20150621/20150621214842_441.png)
相关文章推荐
- [置顶] iOS百度地图SDK之实时绘制轨迹(后台仍执行)
- xcode插件怎么卸载
- ios开发_Runtime
- nagios服务器磁盘损坏==修复方法
- IOS 时间戳
- Nagios安装
- Nagios配置之Windows
- 正则表达式在iOS中的运用
- ios代码实现Autolayout(自动布局)的简单讲解
- iOS学习之AutoLayout常用方法
- Undefined symbols for architecture armXX
- iOS中NSString常用操作合集
- IOS 四种保存数据的方式
- iOS内置音频
- IOS应用程序生命周期
- iOS开发之CGPoint、CGSize、CGRect、CGRectMake、window(窗口)、视图(view)
- 【iOS发展-81】setNeedsDisplay刷新显卡,并CADisplayLink它用来模拟计时器效果
- Xcode bug: imageNamed:方法返回nil
- Missing restore mechanism解决方案
- iOS页面间传值的方式(Delegate/NSNotification/Block/NSUserDefault/单例)