我使用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
,根据苹果的文档,其工作原理是这样的:
如果NSCachedURLResponse不会为请求存在,则该数据是从始发源获取。 如果是请求缓存响应,网址加载系统进行检查,以确定它是否指定的内容必须重新验证响应。 如果内容必须进行重新验证的连接到原始源,看它是否已经改变。 如果没有改变,那么响应是从本地缓存返回。 如果它的变化,该数据是从原始来源获取。
如果缓存响应不指定的内容必须重新验证,在响应中规定的最大年龄或过期检查。 如果缓存响应是足够新,则响应从本地缓存返回。 如果响应被确定为过时,始发源被检查较新的数据。 如果新的数据可用,数据是从原始来源获取,否则它从缓存中返回。
所以,一切只要缓存不陈旧完美的作品,即使在飞行模式。 当缓存过期(最大年龄等),故障块被调用。
我已经挖了一点内部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
。