J'utilise AFNetworking
y SDURLCache
pour toutes mes opérations de réseau.
J'ai SDURLCache
réglé comme ceci :
SDURLCache *urlCache = [[SDURLCache alloc]
initWithMemoryCapacity:1024*1024*2 // 2MB mem cache
diskCapacity:1024*1024*15 // 15MB disk cache
diskPath:[SDURLCache defaultCachePath]];
[urlCache setMinCacheInterval:1];
[NSURLCache setSharedURLCache:urlCache];
Toutes mes demandes utilisent cachePolicy NSURLRequestUseProtocolCachePolicy
qui, selon la documentation d'Apple, fonctionne comme suit :
Si une NSCachedURLResponse n'existe pas pour la demande, alors les données sont récupérées depuis la source d'origine. données sont récupérées à partir de la source d'origine. S'il existe une réponse en cache pour la demande, le système de chargement d'URL vérifie la réponse pour déterminer si elle spécifie que le contenu doit être revalidé. Si le contenu doit être revalidé, une connexion est établie avec la source d'origine pour voir si elle a changé. S'il n'a pas changé, alors la réponse est renvoyée depuis le cache local. S'il a changé, les données sont extraites de la source d'origine.
Si la réponse à la mise en cache ne précise pas que le contenu doit être revalidé, l'âge ou l'expiration maximum spécifié dans la réponse est examinée. Si la réponse de l'antémémoire est suffisamment récente, la réponse est renvoyée depuis le cache local. est renvoyée depuis le cache local. Si la réponse est Si la réponse est périmée, la source d'origine est vérifiée pour voir si elle est plus récente. données plus récentes. Si des données plus récentes sont disponibles, elles sont extraites de la source d'origine. source d'origine, sinon elles sont renvoyées depuis le cache.
Tout fonctionne donc parfaitement, même en mode avion, tant que le cache n'est pas périmé. Lorsque le cache expire (max-age et autres), le bloc d'échec est appelé.
J'ai creusé un peu à l'intérieur de la SDURLCache
et cette méthode renvoie une réponse avec des données valides (j'ai transformé les données en une chaîne de caractères qui contient les informations mises en cache).
- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request {
request = [SDURLCache canonicalRequestForRequest:request];
NSCachedURLResponse *memoryResponse =
[super cachedResponseForRequest:request];
if (memoryResponse) {
return memoryResponse;
}
NSString *cacheKey = [SDURLCache cacheKeyForURL:request.URL];
// NOTE: We don't handle expiration here as even staled cache data is
// necessary for NSURLConnection to handle cache revalidation.
// Staled cache data is also needed for cachePolicies which force the
// use of the cache.
__block NSCachedURLResponse *response = nil;
dispatch_sync(get_disk_cache_queue(), ^{
NSMutableDictionary *accesses = [self.diskCacheInfo
objectForKey:kAFURLCacheInfoAccessesKey];
// OPTI: Check for cache-hit in in-memory dictionary before to hit FS
if ([accesses objectForKey:cacheKey]) {
response = [NSKeyedUnarchiver unarchiveObjectWithFile:
[_diskCachePath stringByAppendingPathComponent:cacheKey]];
if (response) {
// OPTI: Log entry last access time for LRU cache eviction
// algorithm but don't save the dictionary
// on disk now in order to save IO and time
[accesses setObject:[NSDate date] forKey:cacheKey];
_diskCacheInfoDirty = YES;
}
}
});
// OPTI: Store the response to memory cache for potential future requests
if (response) {
[super storeCachedResponse:response forRequest:request];
}
return response;
}
Donc, à ce stade, je n'ai aucune idée de ce qu'il faut faire, car je pense que la réponse est gérée par le système d'exploitation et ensuite AFNetworking
reçoit un
- (void)connection:(NSURLConnection *)__unused connection
didFailWithError:(NSError *)error
à l'intérieur de AFURLConnectionOperation
.