2012-11-03 72 views
4

我想實現一個大文件的下載和顯示用戶目前的進展,但塊:下載大容量文件AFNetworking

-[AFURLConnectionOperation setDownloadProgressBlock:] 

返回不正確的bytesReadtotalBytesRead值(他們比他們應該更小是)。

例如:如果我有一個90MB的文件,當它完全下載時,最新的塊調用setDownloadProgressBlock:給我totalBytesRead值約30MB。另一方面,如果文件大小爲2MB,則最新的塊調用會提供正確的2MB值。

AFNetworking從github更新爲最新版本。
如果AFNetworking無法正確執行,我可以使用什麼解決方案?

編輯:我已經確定,即使文件沒有完全下載(這恰好與比較大的文件,每次)AFNetworking調用成功塊:

-[AFHTTPRequestOperation setCompletionBlockWithSuccess:failure:] 

我問過類似的問題here關於這種情況,但沒有得到任何答案。
我可以檢查下載的代碼和實際文件大小,但AFNetworking沒有用於延續部分下載的API。

+0

嘗試https://github.com/steipete/AFDownloadRequestOperation它也支持恢復部分下載 – Felix

+0

謝謝,但由於某種原因,它不適合我。 – goodfella

回答

11

我在AFNetworking中的setDownloadProgressBlock沒有問題。

維基說明如何跟蹤下載進度: https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-FAQ

對於進度跟蹤,你不需要bytesRead(寫在一個特定的回調的字節數)。

示例代碼:

[downloadoperation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) { 
     float progress = ((float)totalBytesRead)/totalBytesExpectedToRead; 
     self.progressView.progress = progress; 
    }]; 
+0

是的,我瞭解,我的代碼與您的代碼完全相同。我只是說bytesRead在大文件上也給出了不正確的數字。 – goodfella

+0

你能舉個例子嗎?正如我所說的,你可以忽略'bytesRead',因爲它與進度無關。 – Felix

+0

你怎麼用得'的NSLog(@ 「%U%LLU%LLU」,bytesRead,totalBytesRead,totalBytesExpectedToRead);'? bytesRead應該在每個回調中或多或少具有相同的值。 – Felix

1

phix23回答我最初的問題,所以真的有進步塊沒問題。我正在回答我的編輯。

-[AFHTTPRequestOperation setCompletionBlockWithSuccess:failure:] 

成功塊被調用時,我可以比較(是不是很辛苦的代碼來實現),預計將下載的字節數下載字節數。如果下載的字節數較少 - 我可以從中斷的地方繼續下載文件。要做到這一點,我使用Range HTTP頭中NSURLRequest,這裏更多的信息:
Continue an interrupted download on iPhone
How to implement resumable file downloads on iPhone SDK

所以,這個問題是不是真的有AFNetworking(NSURLConnection的具有相同的行爲),但是,我認爲,框架的開發人員可以考慮到這種情況。

+0

〜goodfella「我可以比較預計下載字節數下載的字節數。(是不是很辛苦的代碼來實現)。」你可否透露具體的代碼?你如何得到預期的字節數?我無法找到這樣的API從AFNetworking – Cindeselia

+0

你可以找到示例代碼在下面的類:https://github.com/onivem/Download,特別是在setCompletionBlocks方法。請注意,該課程是爲2013年5月AFNetworking編寫的。 – goodfella