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 请求:

范围:字节=1000-

我希望第一个 206 响应给我一个我要求它开始的块,有一个像这样的标题和值(从 转储allHeaderFields):

“内容范围”=“字节 1000-340197/340198”;

但有时它会跳到前面并返回如下内容:

“内容范围”=“字节 32000-340197/340198”;

这真的很糟糕,因为我需要从 1000 到 32000 的那些字节,但它并没有给我。

我知道没有服务器错误,因为当我卷曲到服务器时,它会返回我要求的部分。另外,当我使用wireshark 时,我看不到任何数据包进入服务器。所以这是 iOS 端的问题,可能与NSURLCache

4

1 回答 1

2

这似乎是NSURLCache. 当我检测到问题已经发生时,我执行以下操作并重试。

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

一旦我这样做了,问题就不会再发生了。它似乎可以治愈缓存。我在 iOS5.0 上看到了这一点,由于我无法再复制,我不知道它是否会发生在较新的操作系统上。

于 2013-03-19T20:26:27.337 回答