2016-01-26 68 views
1

我有一個支持將內容下載到本地磁盤的應用程序。 用戶可以選擇他們想要保存的項目。下載完成後,我將解壓下載的文件並加密,然後保存到本地。我用NSURLSessionbackgroundConfiguration來支持後臺下載。我希望用戶儘快訪問下載的內容,因此我實現了自己的隊列來處理下載項目。我希望下載機制可以在前臺和後臺都能工作。這裏有一些機制及其結果ios URLSession後臺下載FIFO機制

  • 方法1:

首先創建每個下載任務,以及排隊對象

downloadObj.downloadTask = [session downloadTaskWithRequest:request]; 

downloadObj.taskIdentifier = downloadObj.downloadTask.taskIdentifier; 

[Queue enqueue:downloadObj]; 

過程中頭部對象在隊列

obj = [Queue objectAtIndex:0]; 
[obj.downloadTask resume]; 

手柄下一個對象在URLSession委託功能

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)downloadURL { 

    finishObj = [Queue findObjFromIdentifier:downloadTask.taskIdentifier]; 

    nextObj = [Queue findNextObj:finishObj]; 

    [nextObj.downloadTask resume]; 

    [Queue removeObject:finishObj]; 

} 

這種方法可以正常工作,當應用程序總是在前臺。當應用程序進入後臺時,所有創建的downloadTasks似乎會自動恢復。 所以他們會同時分享帶寬。 它不遵循先進先出 ....

  • 方法2:

創建URLSession委託功能下載任務,並直接恢復

這種方法僅下載當應用已經進入後臺時運行的下載任務

任何人都可以給我講述了背景先進先出產權一些建議?

+0

我們有同樣的問題。你有沒有找到解決方案? –

回答

0

如果不啓動NSURLSessionTask對象,您無法保持它。假定您創建對象,調整其設置並立即啓動它。因此,一旦創建對象IIRC,某些超時就開始倒計時。因此,如果您創建對象,然後在一兩分鐘後啓動它,它甚至會在啓動之前超時。不幸的是,我很確定這個事實在任何文檔中都沒有提及。

一個好得多的(讀「可能工作」)方法是存儲NSURLRequest對象,並將其排入隊列。然後,在適當的時候,請求請求,創建一個任務並開始執行它。