严格意义上来说,iOS并不能像Android一样,真的在后台开启一个下载Service,一直下载。但是它可以进行在系统允许范围内的后台上传和下载。

当使用

NSURLSessionConfiguration* sessionConfig = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:identifier];
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:self.operationQueue];

创建一个Session后,由此Session创建出的NSURLSessionDownloadTask 和 NSURLSessionUploadTask 都会被交给系统的Background Transfer Services负责上传下载。 这种方法创建的task,不支持block形式的创建方法,必须使用比较原始的delegate回调方式。而且目前NSURLSessionDataTask对background模式的支持不好,切入后台后, 没有任何系统回调函数, 过一段时间再把程序切入前台直接报错。至于原因,有如下帖子说明:

https://stackoverflow.com/questions/39639268/ios-background-task-using-nsurlsessiondatatask

其中的主要意思是,NSURLSessionDataTask是把数据保存在内存中的,而Background Transfer Services无法跨进程读取内存数据。但是实际上,官方文档并没有说明DataTask不支持后台模式,很可能是目前的iOS版本里存在bug。

官方推荐的使用方法是在一个Session中,直接将需要处理的任务全部开启,程序进入后台,这些任务全部下载完成后,系统会通知程序。这种模式很适合下载的Url数量很少的情况,比如只需要下载几个url中的数据。但是如果需要下载几十个或是上百个url的资源,我们就不能一下子发起那么多的请求,服务器很可能无法及时响应,导致请求超时出错。那么想要达到后台下载的效果,就需要把众多请求分组放入多个Session,一个Session中的所有下载完成后,系统回产生回调,我们在系统回调中再次开启新的Session,继续下载。

最新文章

  1. AngularJs学习笔记(制作留言板)
  2. MVC缓存
  3. 新手理解HTML、CSS、javascript之间的关系
  4. AngularJs bower install 卡主不动解决办法
  5. 转 纯CSS设置Checkbox复选框控件的样式
  6. 夺命雷公狗ThinkPHP项目之----企业网站5之栏目的添加(主要是图片上传)
  7. NSData与UIImage互相转换
  8. 剑指offer 栈的压入弹出 顺序
  9. mysql进阶知识
  10. 【tmos】SpringBoot登录拦截
  11. canvas-0scale.html
  12. text3
  13. Java 修饰符顺序问题
  14. 关于elment-ui树形控件Tree的使用
  15. day4-课堂笔记
  16. 如何提升mysql replication的性能&多线程传输二进制日志
  17. [Ubuntu] 如何在 Lubuntu 安装 python-spidermonkey
  18. 用Spider引擎解决数据库垂直和水平拆分的问题
  19. php date strtotime的用法
  20. 调试和开发npm模块的方式

热门文章

  1. 孤陋寡闻了吧?Python 居然可以做这30件神奇好玩的事情(附教程)
  2. html的基础知识点
  3. CentOS7.x安装nodejs-10.16.3
  4. 多任务创建-线程(IO密集型适用)
  5. 使用bootstrap的栅格布局,用row后出现横向滚动条
  6. Python3入门与进阶【笔记】
  7. redis危险命令
  8. div 里面内容水平垂直居中
  9. mysql数据库中锁机制的详细介绍
  10. 二十五 存储技术与应用 iSCSI技术应用 、 udev配置 NFS网络文件系统 、 Multipath多路径 、 NFS网络文件系统 、 udev配置