看板 MacDev 關於我們 聯絡資訊
我現在用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
darktt: 你的Configuration要改成backgroundSessionConfigurationW 01/27 13:28
darktt: ithIdentifier 01/27 13:28
kuokuo321: 在建session的時候有用backgroundSessionConfiguration 01/27 13:59
kuokuo321: HTTPConnectionPerHost也設成 1 01/27 14:00
kuokuo321: 不過來源不一定是同一個Host 01/27 14:00
springgo: 可以用NSOerationQueue去控制你的download task 01/27 21:25
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
uranusjr: 還有一個方法是用 GCD 開個共用 queue 然後設成 serial 01/28 14:41
uranusjr: 奇怪我記得這很久之前有討論過, 但找了很久找不到, 算了 01/28 14:50
vampirewalk: 設 queue.maxConcurrentOperationCount=1 ? 01/28 15:46
感謝提醒 以補上 ※ 編輯: kuokuo321 (122.116.40.230), 01/28/2016 16:30:54