4

ファイルをダウンロードするときに、ダウンロードを再開できるようにしたいと思います。例えば:

NSFileManager *fm = [NSFileManager defaultManager];
NSString *downloadTempPath = [_tempPath path];
if ([fm fileExistsAtPath:downloadTempPath]) {
    // We have a partial download. Get the rest of the file starting at byteCount
    NSDictionary *dAttrib = [fm attributesOfItemAtPath:downloadTempPath error:nil];
    NSUInteger byteCount = [dAttrib fileSize];
    NSLog(@"Preparing to resume download: %@", downloadTempPath);
    NSString *requestRange = [NSString stringWithFormat:@"bytes=%d-", byteCount];
   [self.request setValue:requestRange forHTTPHeaderField:@"Range"];
}

これにより、次のようなヘッダーを持つgetリクエストが生成されます。

範囲:bytes = 1000-

最初の206の応答は、次のようなヘッダーと値(からダンプされたallHeaderFields)を持つ、開始を要求したチャンクを提供することを期待します。

"Content-Range"="バイト1000-340197/340198";

しかし、時々それは先にジャンプして、代わりに次のようなものを返します:

"Content-Range"="バイト32000-340197/340198";

1000〜32000のバイトが必要で、それが私に与えられなかったので、これは本当に悪いことです。

サーバーにカールすると、要求したセクションが返されるため、サーバーエラーが発生しないことはわかっています。また、wiresharkを使用すると、サーバーにパケットが送信されません。したがって、これはiOS側の問題であり、おそらくNSURLCache

4

1 に答える 1

2

のバグのようNSURLCacheです。問題が発生したことを検出したら、次の手順を実行して再試行します。

    [[NSURLCache sharedURLCache] removeCachedResponseForRequest:self.request]; 

それをしたら、問題は二度と起こりません。キャッシュを修復するようです。これは iOS5.0 で発生しましたが、再現できなくなったため、新しい OS で発生するかどうかはわかりません。

于 2013-03-19T20:26:27.337 に答える