[問題] 背景下載

看板MacDev作者 (kuokuo)時間8年前 (2016/01/27 12:33), 8年前編輯推噓1(109)
留言10則, 5人參與, 最新討論串1/1
我現在用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://www.ptt.cc/bbs/MacDev/M.1453869187.A.78C.html

01/27 13:28, , 1F
你的Configuration要改成backgroundSessionConfigurationW
01/27 13:28, 1F

01/27 13:28, , 2F
ithIdentifier
01/27 13:28, 2F

01/27 13:59, , 3F
在建session的時候有用backgroundSessionConfiguration
01/27 13:59, 3F

01/27 14:00, , 4F
HTTPConnectionPerHost也設成 1
01/27 14:00, 4F

01/27 14:00, , 5F
不過來源不一定是同一個Host
01/27 14:00, 5F

01/27 21:25, , 6F
可以用NSOerationQueue去控制你的download task
01/27 21:25, 6F

01/27 21:26, , 7F
打錯字了 是NSOperationQueue
01/27 21:26, 7F
感謝建議 補上目前作法 方法是開一個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

01/28 14:41, , 8F
還有一個方法是用 GCD 開個共用 queue 然後設成 serial
01/28 14:41, 8F

01/28 14:50, , 9F
奇怪我記得這很久之前有討論過, 但找了很久找不到, 算了
01/28 14:50, 9F

01/28 15:46, , 10F
設 queue.maxConcurrentOperationCount=1 ?
01/28 15:46, 10F
感謝提醒 以補上 ※ 編輯: kuokuo321 (122.116.40.230), 01/28/2016 16:30:54
文章代碼(AID): #1Mg4Y3UC (MacDev)