2016-05-13 32 views
3

我需要暫停下載任務並在應用程序重新啓動後恢復。但我不確定應使用哪種方法,suspendcancelByProducingResumeDataNSURLSessionDownloadTask cancelByProducingResumeData vs suspend

隨着cancelByProducingResumeData我可以得到部分下載的數據,並用它重新創建下載任務。但是,我必須手動管理數據,將其保存到文件中,然後重新讀取並重新創建任務,並確保新任務不會失敗。

使用suspend,我可以暫停並恢復下載任務。但是,我可以在應用程序重新啓動後繼續執行此任務嗎?我正在使用後臺會話,以便在重新啓動時保留任務。

cancelByProducingResumeData已經requirements爲它工作,做這些要求也適用於suspend/resume?或suspend/resume只是意味着「臨時暫停任務」,如文件所述?

+0

根據我的閱讀,cancelByProducingResumeData是您唯一的選擇。 – jtbandes

回答

1

你在糾正這個問題。下載任務的「恢復數據」是而不是直到該點任務收到的​​數據。這是一小部分簿記數據 - 你通常會在NSUserDefaults中投入數組。

這樣說,要回答原來的問題,任務只在會話的上下文中有效。因此,對於前臺會話,一旦您的應用程序退出,會話將不復存在,因此無法再訪問該會話中的任務。因此,在重新啓動應用程序後,由於該任務不再存在(因爲其會話不再存在),因此無法恢復暫停的任務。

對於後臺會話,您幾乎不得不請基金會網絡團隊中的某位人員來獲得該答案的答案,因爲這取決於您事後可以重新創建會話的程度。但是,我的猜測是,它可能不會在那裏工作,如果它,那麼你應該認爲它不受支持。

+0

您是否聲稱在應用程序啓動之間「恢復數據」不可用?這是記錄在哪裏? – jtbandes

+0

不,完全沒有。到目前爲止,任務已收到的數據通過下載任務靜默存儲在磁盤上的文件中。簡歷數據只是告訴新任務在哪裏找到它。這就是爲什麼它是如此小小的數據。 – dgatwood

+0

好吧,我很困惑,因爲讀得太快了 - 通過*「在您重新啓動應用程序後無法恢復暫停的任務」*您確實是指suspend()編輯,而不是cancelByProducingResumeData,我相信這會服務於OP的需求。 – jtbandes

1

在蘋果開發的形式經過一番研究,我發現this

任務懸架很少使用,當它是,它主要是用來暫時禁用回調是某種併發控制系統的一部分。這是因爲暫停的任務仍然可以在線路上激活;暫停所做的一切都是阻止它在內部取得進展,發出回調等等。

OTOH,如果您正在實施長期暫停(例如,用戶想要暫停下載),則最好不要調用-cancelByProducingResumeData :.

所以suspend實際上可能沒有停止下載,我應該使用cancelByProducingResumeData:長期停頓。

+0

這不完全正確。在某些時候,TCP套接字的接收緩衝區應該填滿,因爲沒有人讀取它,遠程主機應該停止發送數據。這樣說的話,除非你用它來暫停批量轉移,否則它可能不會給你多少錢,所以你可以做更重要的事情。 – dgatwood

相關問題