4

大きなファイルのダウンロードを実装して、現在の進行状況をユーザーに表示しようとしていますが、ブロックインします。

-[AFURLConnectionOperation setDownloadProgressBlock:] 

正しくない値bytesReadを返しtotalBytesReadます(本来よりも小さい値です)。

例:90MBのファイルがあり、それが完全にダウンロードされた場合、の最新のブロック呼び出しで約30MBの値がsetDownloadProgressBlock:得られます。totalBytesRead一方、ファイルのサイズが2MBの場合、最新のブロック呼び出しで正しいtotalBytesRead2MBの値が得られます。

AFNetworkingはgithubから最新バージョンに更新されます。
AFNetworkingで正しく実行できない場合、どのような解決策を使用できますか?

編集:ファイルが完全にダウンロードされていない場合でも(これは比較的大きなファイルで毎回発生します)、AFNetworkingは成功ブロックを呼び出します:

-[AFHTTPRequestOperation setCompletionBlockWithSuccess:failure:]

私はこの状況についてここで同様の質問をしましたが、何の答えも得られませんでした。
ダウンロードしたコードと実際のファイルサイズをチェックインできますがAFNetworking、部分的なダウンロードを続行するためのAPIがありません。

4

2 に答える 2

12

AFNetworking の setDownloadProgressBlock に問題はありません。

wiki では、ダウンロードの進行状況を追跡する方法について説明しています: 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;
    }];
于 2012-11-03T11:34:52.380 に答える
1

phix23 answered to my initial question, so there is really no problem with progress block. I'm answering to my edit.

When success block in

-[AFHTTPRequestOperation setCompletionBlockWithSuccess:failure:]

is called, I can compare the number of bytes downloaded with the number of bytes expected to download (it is not very hard to implement in code). If the number of downloaded bytes is smaller - I can continue file download from place where it was interrupted. To do this, I'm using Range http header in NSURLRequest, here is more information:
Continue an interrupted download on iPhone
How to implement resumable file downloads on iPhone SDK

So, the problem is not really with AFNetworking (NSURLConnection has same behavior), but, I think, developers of the framework could take into account this situation.

于 2012-11-04T17:57:33.903 に答える