2012-03-07 91 views
1

我想從服務器下載一個大文件(> 500MB)到我的應用程序。我使用NSURLConnection,如果網絡非常好,那就很好。但有時我試圖下載500MB文件,但如果網絡不是很好,只能下載200MB或100MB文件。這意味着當任務沒有完成時,我得到了connectionDidFinishLoading方法。有人說設置超時秒來避免這種情況,但我設置超時30秒,它不工作。我應該設置60s或更多?有人有更好的主意,請幫助我。NSURLConnection(下載大於500M的大文件)

+0

因此,在下載所有數據之前,您已經獲得了'connectionDidFinishLoading'?這聽起來不對。如果沒有下載所有的數據,我希望得到一個錯誤。 – mattjgalloway 2012-03-07 09:58:12

+0

這確實聽起來不對,你可以發佈一些測試代碼嗎?你的網絡意味着什麼不太好? – fbernardo 2012-03-07 10:41:51

+0

如果他們解決了您的問題,您應該接受答案。 – MrTJ 2012-03-14 09:22:03

回答

0

in connectionDidFinishLoading方法每次檢查要下載的數據的長度和下載的數據。

數據

長度要下載此[response expectedContentLength];didReceiveResponse方法

+0

你不能指望預期的內容長度。對於服務器來說,它是可選的。 – fbernardo 2012-03-07 10:38:56

0

你應該下載這樣的大文件中的部分漲幅。在HTTP請求的標題中指定Content-Range字段,並且一次只詢問文件的一小部分。當你獲得所有部分時,你可以將文件組裝在一起。

您可以使用NSMutableURLRequest setValue:@"0-1023/*" forHTTPHeaderField:@"Content-Range"];來設置HTTP標頭,該示例僅下載文件的第一個千字節。請參見http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html中的內容範圍

+0

另外,並非所有服務器都支持Content-Range。我記得例如用於拒絕非付費用戶的部分下載,因爲使用Content-Range可以繼續下載。使用這種類型的服務器,您可以全部下載,也可以不下載。 – fbernardo 2012-03-07 10:40:55

+0

@fbernardo是對的,你必須檢查你的服務器是否支持這個。我以某種方式假設你可以控制服務器。如果它不支持,除了希望你的文件將作爲一個整體到達,沒有什麼可做的。 – MrTJ 2012-03-07 10:42:56

+0

你是對的,它看起來好像他控制着服務器,我只是建議構建可在多種情況下工作的可移植代碼會更好...... – fbernardo 2012-03-07 10:47:44