作者kuokuo321 (kuokuo)
看板MacDev
标题[问题] 背景下载
时间Wed Jan 27 12:33:03 2016
我现在用NSURLSession 里的 NSURLSessionDownloadTask来实作背景下载
因为下载的档案有点大,又希望使用者可以尽早的看到下载完的档案内容
所以另外做了一个Queue去maintain下载顺序,希望频宽都用在一个档案上
做法就是先把downloadTask new出来([session downloadTaskWithRequest:request])
然後在 didFinishDownloadingToURL 里让下一个downloadTask resume
这个做法在前景执行的时候看起来很正常
但放到背景之後 所有被new出来的downloadTask似乎会开始一起占用频宽
所以下载完成的时间会差不多.....
我希望他到背景执行的时候还是可以维持FIFO的模式(像KKBox的下载伫列一样)
另外我有试过在didFinishDownloadingToURL中才new下一个downloadTask
可是在进入背景後 我的写法看来只会确保进入前new出的downloadTask被执行完
当我有多个大档案要下载就会很容易出现只载好第一个的状况
想请问各位前辈有什麽建议呢?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 122.116.40.230
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/MacDev/M.1453869187.A.78C.html
1F:→ darktt: 你的Configuration要改成backgroundSessionConfigurationW 01/27 13:28
2F:→ darktt: ithIdentifier 01/27 13:28
3F:→ kuokuo321: 在建session的时候有用backgroundSessionConfiguration 01/27 13:59
4F:→ kuokuo321: HTTPConnectionPerHost也设成 1 01/27 14:00
5F:→ kuokuo321: 不过来源不一定是同一个Host 01/27 14:00
6F:→ springgo: 可以用NSOerationQueue去控制你的download task 01/27 21:25
7F:→ springgo: 打错字了 是NSOperationQueue 01/27 21:26
感谢建议
补上目前作法
方法是开一个operation queue, 设 queue.maxConcurrentOperationCount=1
(为了可以做到FIFO)
然後每一个下载task都在operation里create
create後 马上resume,之後放个NSRunLoop,
等到didFinishDownloadingToURL後再break这个Loop
然後系统就会继续下一个operation
不过测试的时候发现需要有点耐心 需要多等一下
※ 编辑: kuokuo321 (122.116.40.230), 01/28/2016 12:17:19
8F:→ uranusjr: 还有一个方法是用 GCD 开个共用 queue 然後设成 serial 01/28 14:41
9F:→ uranusjr: 奇怪我记得这很久之前有讨论过, 但找了很久找不到, 算了 01/28 14:50
10F:推 vampirewalk: 设 queue.maxConcurrentOperationCount=1 ? 01/28 15:46
感谢提醒 以补上
※ 编辑: kuokuo321 (122.116.40.230), 01/28/2016 16:30:54