Я использую AFNetworking
и SDURLCache
для всех своих сетевых операций.
У меня SDURLCache
установлено следующее:
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];
Весь мой запрос использует cachePolicy NSURLRequestUseProtocolCachePolicy
, который, согласно документам apple, работает следующим образом:
Если для запроса не существует NSCachedURLResponse, тогда данные извлекаются из исходного источника. Если есть кешированный ответ для запроса, система загрузки URL-адресов проверяет ответ чтобы определить, указывает ли он, что содержимое должно быть пересмотрено. Если содержимое должно быть подтверждено, соединение выполнено с чтобы узнать, изменилась ли она. Если он не изменился, то ответ возвращается из локального кеша. Если он изменился, данные извлекаются из исходного источника.
Если кешированный ответ не указывает, что содержимое должно быть пересмотрено, максимальный возраст или срок действия, указанный в ответе рассматривается. Если кешированный ответ достаточно недавний, то ответ возвращается из локального кеша. Если ответ определяется как устаревший, исходный источник проверяется на более новые данные. Если доступны более новые данные, данные извлекаются из исходный источник, в противном случае он возвращается из кеша.
Таким образом, все работает отлично даже в режиме самолета, пока кеш не устарел. Когда кеш истекает (max-age и другие), вызывается блок отказа.
Я немного искал внутри SDURLCache
, и этот метод возвращает ответ с достоверными данными (я проанализировал данные в строке и содержал кешированную информацию)
- (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;
}
Итак, на данный момент я понятия не имею, что делать, потому что я считаю, что ответ обрабатывается ОС, а затем AFNetworking
получает
- (void)connection:(NSURLConnection *)__unused connection
didFailWithError:(NSError *)error
внутри AFURLConnectionOperation
.