我正在使用AFNetworking
andSDURLCache
进行所有的网络操作。
我是这样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 不存在,则从原始源获取数据。如果请求有缓存响应,则 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
。