2013-11-22 71 views
2

我有要求下載一些文件(500左右)。我有一個包含這些文件的所有url的數組,我想使用NSURLSession,這樣我也可以支持後臺下載。NSurlSession - 下載許多文件

我想不出正確的方法來實現這一點。如果我在完成一個文件後啓動下一個文件下載,則後臺下載將不起作用。

我應該創建多個下載任務並啓動?

請建議我如何做到這一點。

+0

您可以爲此使用隊列。實現您自己的數據管理器,並相應地委託屬性,並在功能上實現隊列。另外我覺得'NSURLConnection'確實已經實現了這個。所以,你可以忘記所有的連接,並直接要求'NSURLConnection'來領導所有的文件。 –

+0

有沒有令人信服的理由使用NSURLConnection?或者你可以使用NSURLSession(> = iOS 7)? – CouchDeveloper

+0

對不起,我正在談論NSURLSession(現在編輯)。它支持後臺下載,但直接下載一個大文件,但我的問題是關於下載一些中小型文件。 – Amit

回答

0

編輯: 首先,對於遲到的回覆抱歉,這裏是解決您的問題。從下載Apple的Simple Background Transfer樣本開始。然後,您將在視圖控制器中看到URLSessionDidFinishEventsForBackgroundURLSession方法。你可以修改這個方法來調用另一個下載任務,如下面的示例,我認爲這是你想要做的。

對此方法也有類似如下的評論會話代表將收到此消息以指示先前已爲此會話入隊的所有消息已發送。因此,爲您的請求創建隊列可能是更好的解決方案。

- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session 
{ 
    APLAppDelegate *appDelegate = (APLAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    if (appDelegate.backgroundSessionCompletionHandler) { 
     void (^completionHandler)() = appDelegate.backgroundSessionCompletionHandler; 
     appDelegate.backgroundSessionCompletionHandler = nil; 
     completionHandler(); 

     [self start:nil]; 
    } 

    NSLog(@"All tasks are finished"); 
} 
+0

如果您有下載500個文件的要求,這是否自動暗示此操作必須是可取消的並且可恢復? – CouchDeveloper

+0

如果我有這樣的要求,是的,它必須是可以取消的,但他沒有提到任何關於它的任何事情。它可以是一個學校項目,或者他可以做一些基準測試。如果他將更具體的需求更新他的問題,我可以很樂意編輯我的答案。 – BoranA

+0

請參閱編輯,我錯誤地提出問題的道歉。恢復和取消將成爲要求的一部分,但目前我只是在尋找下載解決方案。 – Amit

0

我遇到了這個問題。我的應用程序必須進行自我更新和下載新聞視頻在後臺使用背景FETCH獲取文件的JSON名單,然後燒製關n已Web服務調用數使用後臺傳輸

[NSURLSessionConfiguration backgroundSessionConfiguration下載這些文件:

對於每個文件我創建一個NSSession和一個NSURLSessionDownloadTask。

file 1 - NSSession1 > NSURLSessionDownloadTask1 
file 2 - NSSession2 > NSURLSessionDownloadTask2 
file 3 - NSSession3 > NSURLSessionDownloadTask3 

當應用程序在前臺時,這個醒了。

但是,當應用程序在後臺並且由BACKGROUND FETCH喚醒時,我遇到了一些問題 將會下載一個文件,然後停止。 這就好像只有第一個NSSession1被執行了。 它可能已被認爲iOS的等待,直到設備被閒置再次運行下屆會議但這是太慢

我得到了它具有一個NSSession和安裝所有NSURLSessionDownloadTask3

工作
NSURLSession * backgroundSession_ = 
for(url to call){ 
    create NSURLSessionDownloadTask1 (set its session:backgroundSession_) 
    create NSURLSessionDownloadTask2 (set its session:backgroundSession_) 
    create NSURLSessionDownloadTask3 (set its session:backgroundSession_) 
} 

做時要小心這 通話NSSession finishTasksAndInvalidate不invalidateAndCancel

//[session invalidateAndCancel]; 
    [session finishTasksAndInvalidate]; 

invalidateAndCancel將停止會話並沒有完成其他下載任務