作者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/m.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