A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

卜小天

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© 卜小天 初级黑马   /  2017-3-27 20:48  /  1574 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 卜小天 于 2017-3-27 20:50 编辑

我们有时在边聊天边下载大文件时,感觉很卡,这时可以暂停下载任务,聊完天再继续下载文件。这就是断点下载。iOS中利用NSURLSession可以进行文件断点下载,下面就一起来实现它把!! 说明:感谢网友TomLoveSweet的建议!在resume方法中,应该是[self.task resume];不是[self resume].还有这个方法中第一句需要用self.task接收一下。对这个错误,我表示深感歉意!
                                      第一部分 知识储备
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.NSURLSessionDownloadDelegate的代理方法:
    它有三个方法:

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只创建一次,同时也让控制器拥有了这个属性。
1.  在调用pause这个方法时,存在着一定的风险,因为self对task进行了强引用,task又对block进行了引用,block又对self进行引用,这就形成了循环使用。怎么解决这个问题呢?
解决方法:对self进行弱引用 __weak typedef(self)   vc=self
2. 如果设置了completion和block,又实现了代理方法,程序优先执行block









0 个回复

您需要登录后才可以回帖 登录 | 加入黑马