Skip to content

常见问题

Danie1s edited this page Feb 28, 2020 · 3 revisions

前言

Tiercel 的主要特性和作用

Tiercel 诞生以来就为了让开发者可以简单地完成下载方面的业务,尽量地集成常见的、跟下载相关的功能,简单来说,差不多就是一个没有界面的简陋版迅雷,所以关于 Tiercel 的特性和逻辑,大部分都可以参考迅雷等下载软件。而 Tiercel 的最主要特性和作用就是:后台下载下载任务管理。了解这一点对于开发者是否需要使用 Tiercel 、解决使用 Tiercel 过程中遇到的问题非常重要。

后台下载

众所周知,iOS 是封闭的系统,在很多方面有严格的限制。 App 在后台的活动也是受到限制,所以后台下载并不是一个普通的功能,在开启支持后台下载的任务时候,系统会有另外一个进程对它进行管理,导致支持后台下载的任务会比普通下载任务消耗更多的资源,而系统为了控制资源开销,会对支持后台下载的任务并发进行限制,目前最大并发数是 6。可以查看 iOS 原生级别后台下载详解 来了解更多相关细节。

常见问题

后台多任务下载特别慢

官方文档有提到,iOS 为了减少资源开销会对后台下载进行限制,如果 App 在后台的时候去新开启一个下载任务,系统会延迟去执行,而这个延迟的时间每次都会增加,也就是苹果不建议开发者滥用后台下载,而是事先在前台把任务都开启了。

批量下载时总进度错乱

由于系统会限制了下载任务的并发数,所以在某个时间点,下载任务的总大小只是前面某些任务的文件总大小,并不是全部任务的文件总大小。而一般提出这个问题的开发者,他们都是使用 Tiercel 下载大量的小文件,这些小文件很快就会被下载完成,然后开启后面的任务,所以总大小会一直发生改变,而已经下载的文件大小也在改变,所以总进度会错乱。这样看起来这个总进度貌似有点多余,但前面我也提到过 Tiercel 的特性和逻辑跟大部分的下载软件差不多,这些软件在这个问题上的处理也是一样的,当新的任务开启后,才会被算进下载任务的总大小。当然这个问题也有解决的办法,就是用完成任务数与总任务数的比作为总进度。

批量下载性能问题

目前 Tiercel 已经进行了多次优化,对数千个甚至上万个下载任务进行批量操作应该没什么大的性能问题。但需要注意的是,支持后台下载的任务会比普通下载任务消耗更多的资源,同时 Tiercel 具有对下载任务进行管理等功能,这些功能是需要 Tiercel 在内部进行一定处理,而不是简单的开启任务等待下载完成,所以当批量操作的任务数量到了一定的程度时,操作速度肯定会逐步变慢、内存占用肯定有提升。手机的性能非常有限,就算是性能很好的电脑,也不应该同时下载数量这么庞大的文件,正常来说如果同时下载的文件达到上百个的话,最好就把它们压缩成一个文件进行下载,节省大量的资源,这才是最优的做法。

显示下载成功,但文件不存在

为了减少重复下载,Tiercel 开启下载前会先判断任务是否已经完成,如果 SessionManager 里面存在某个已经下载成功任务,那么这个任务就不会再次开启下载,也不会去检查它对应的文件是否存在,这个逻辑也跟很多下载软件一样。正常来说文件不会自动消失,如果文件不存在,那么肯定是被挪动或者删除,这不属于 Tiercel 负责的范围。所以需要重新下载的话,请先把对应的任务删除。

下载进度 100%,但下载不成功

对于某些下载任务,虽然把服务器返回的文件下载完成了,但并不是原来期望的文件,例如:htmlxml 等格式的文件,这些文件可能只是一些错误提示的文件,不是正确的文件。当出现这种情况的时候,Tiercel 不保留这些文件,而下载任务里面会有保留 HTTPURLResponse 对象和 HTTP Status Code ,也会有 error ,开发者应该根据它们来做出相应的处理。

正确使用 Tiercel 的方式

如果有阅读本文前面的内容,可能会觉得 Tiercel 有不少实用的功能,但同时使用起来又有诸多限制,实用性大打折扣。但由于我们开发平台的手机端并且是 iOS 系统,为了性能、资源开销、用户体验等方面的考虑,所以才存在这些限制,这些限制不是 Tiercel 独有的,就算直接使用原生的 API,这些限制还是会存在。

综上所述,虽然 Tiercel 支持批量操作,支持后台下载,但是正确使用方式是:

  • 尽量减少批量操作的任务数量,如果实在需要下载大量文件,请把它们压缩打包下载
  • 尽量在前台开启所有任务,不要滥用后台下载
  • 当文件下载完成后,非必要的话,请从 SessionManager 中移除对应的任务,这样会减少内存占用,减轻 Tiercel 对任务管理的负担