2013-03-19 1 views
4

При загрузке файла я хочу иметь возможность возобновить загрузку. Например:NSURLResponse возвращает Content-Range, игнорируя диапазон, который я задал для

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):

«Content-Range» = «байты 1000-340197/340198»;

Но иногда он прыгает вперед и возвращает что-то вроде этого, вместо:

"Content-Range" = "байт 32000-340197/340198";

Это действительно плохо, потому что мне нужны эти байты с 1000-32000, и он не дал их мне.

Я знаю, что ошибки сервера нет, потому что когда я зацикливаюсь на сервере, он возвращает раздел, который я просил. Кроме того, когда я использую wirehark, я не вижу никакого пакета, идущего на сервер. Так что это проблема на стороне iOS, возможно, с NSURLCache

ответ

1

Это, как представляется, ошибка в NSURLCache. Когда я обнаруживаю, что проблема произошла, я делаю следующее и повторю попытку.

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

Как только я это сделал, проблема не повторится. Кажется, он исцеляет кеш. Я видел это на iOS5.0, и, поскольку я больше не могу воспроизводить, я не знаю, происходит ли это на более новых ОС.

+0

Я столкнулся с аналогичной проблемой на iOS 8.1.2. Запрос не содержал заголовков «Range» или «If-Range», но ответ возвращал частичный контент заголовку Content-Range. Я исправил это, полностью исключив использование кеша с политикой кэша NSURLRequestReloadIgnoringLocalCacheData'. – Yan