2013-03-19 1 views
4

Lors du téléchargement d'un fichier, je souhaite pouvoir reprendre le téléchargement. Par exemple:NSURLResponse renvoie Content-Range, en ignorant la plage que j'ai demandée

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"]; 
} 

Cela produira une demande d'obtenir avec un en-tête comme ceci:

Gamme: octets = 1000-

j'attendre la première 206 réponse à me donner un morceau où je lui ai demandé de commencer, ayant un en-tête et une valeur comme celle-ci (jeté de allHeaderFields):

"Content-Range" = "octets 1000-340197/340198";

Mais parfois, il saute avant et retourne quelque chose comme ceci:

"Content-Range" = "octets 32000-340197/340198";

Ce qui est vraiment mauvais, parce que j'ai besoin de ces octets de 1000-32000, et il ne me les a pas donnés.

Je sais qu'il n'y a aucune erreur de serveur, parce que quand je boucle sur le serveur il renvoie la section que j'ai demandée. En outre, quand j'utilise wireshark, je ne vois aucun paquet allant au serveur. Donc, c'est un problème du côté iOS, peut-être avec le NSURLCache

Répondre

1

Il semble être un bug dans le NSURLCache. Lorsque je détecte que le problème s'est produit, je fais ce qui suit et réessaie.

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

Une fois que j'ai fait cela, le problème ne se reproduit plus. Il semble guérir le cache. Je l'ai vu sur iOS5.0, et comme je ne peux plus reproduire, je ne sais pas si cela arrive sur les OS récents.

+0

J'ai fait face à un problème similaire sur iOS 8.1.2. La requête ne contenait aucun en-tête 'Range' ou' If-Range', mais la réponse renvoyait un contenu partiel avec l'en-tête 'Content-Range'. J'ai corrigé ceci en supprimant entièrement l'utilisation du cache avec la stratégie de cache 'NSURLRequestReloadIgnoringLocalCacheData'. – Yan

Questions connexes