私はすべてのネットワーク操作にAFNetworking
andを使用しています。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 が存在しない場合、データは元のソースからフェッチされます。要求に対するキャッシュされた応答がある場合、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;
}
したがって、この時点で何をすべきかわかりません。応答は OS によって処理され、その後AFNetworking
、
- (void)connection:(NSURLConnection *)__unused connection
didFailWithError:(NSError *)error
内部AFURLConnectionOperation
。