作者
Dan1els来源
简书,可点击左下“阅读原文”查看
初衷很久以前,我发现了一个将要面对的问题:
怎样才能并发地下载一堆文件,并且全部下载完成后再执行其他操作?
当然,这个问题其实很简单,解决方案也有很多。但我第一时间想到的是,目前是否存一个具有任务组概念,非常权威,非常流行、稳定可靠,并且是用Swift写的,Github上star非常多的下载框架?如果存在这样的轮子,我就打算把它作为项目里专用的下载模块。很可惜,下载框架很多,也有很多这方面的文章和Demo,但是像AFNetworking、SDWebImage这种著名权威,star非常多的,真的一个都没有,而且有一些还是用NSURLConnection实现的,用Swift写的就更少了,这让我有了打算自己实现一个的想法。
理想与现实轮子这种东西,既然要自己撸,就不能随便,而且下载框架这方面也没权威著名的,所以一开始我打算满足自己需求的同时,尽量能做更多的事情,争取以后负责的项目都可以用得上。首先要满足的就是后台下载,众所周知iOS的App在后台是暂停的,那么要实现后台下载,就需要按照苹果的规定,使用URLSessionDownloadTask。
网上一搜就有大量的相关文章和Demo,然后我就开始愉快地撸代码。结果撸到一半发现,真正实现起来并且没有网上的文章说得那么简单,测试发现开源的轮子和Demo也有很多地方有Bug,不完善,或者说没有完整地实现后台下载。于是只能靠自己继续深入的研究,但当时确实没有这方面研究地比较透彻文章,而时间方面也不允许,必须得尽快撸个轮子出来使用。所以最后我妥协了,我用了一个比较容易处理的办法,改成用URLSessionDataTask实现,虽然不是原生支持后台下载,但我觉得总有一些邪门歪道可以实现的,最后我写出了Tiercel,一个对现实妥协的下载框架,不过已经满足了我的需求。
勿忘初心因为其实我并没有遇到后台下载硬性需求,所以我一直没有寻找其他办法去实现,而且我觉得如果要做,就必须使用URLSessionDownloadTask,实现原生级别的后台下载。随着时间的推移,我心里一直都觉得没有完成当初的想法是一个极大的遗憾,于是我最后下定决心,打算把iOS的后台下载研究透彻。
终于,完美支持原生后台下载的Tiercel2[1]诞生了。下面我将详细讲解后台下载的实现和注意事项,希望能够帮助有需要的人。
后台下载关于后台下载,其实苹果有提供文档---DownloadingFilesintheBackground[2],但实现起来要面对的问题比文档说的要多得多。
URLSession首先,如果需要实现后台下载,就必须创建BackgroundSessions
privatelazyvarurlSession:URLSession={letconfig=URLSessionConfiguration.background(withIdentifier:"