すべてのネットワーク操作にAFNetworking
とSDURLCache
を使用しています。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が要求のために存在しない場合、元のソースから データがフェッチされます。要求に応じてキャッシュされた 応答がある場合、URLローディングシステムは応答 をチェックして、コンテンツの再検証が必要であると指定しているかどうかを判断します。 コンテンツの再検証が必要な場合は、 発信元に接続が変更されているかどうかが確認されます。変更されていない場合は、 の応答がローカルキャッシュから返されます。変更されている場合は、 元のソースからデータがフェッチされます。
キャッシュされた応答でコンテンツの再検証が必要であると指定されていない場合は、応答 で指定された最大有効期間または有効期限が検査されます。キャッシュされた応答が十分に最新である場合、 応答がローカル・キャッシュから戻されます。応答が無効であると判定された場合は、 のデータが新しいかどうかを確認します( )。より新しいデータが利用可能であれば、データは 発信元からフェッチされ、それ以外の場合はキャッシュから返されます。
飛行機モードであっても、キャッシュが古くない限り、すべてが完全に機能します。キャッシュが期限切れになると(max-ageなど)、障害ブロックが呼び出されます。
だからこれで(私は文字列にデータを解析されてきたし、それがキャッシュされた情報が含まれています)- (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;
}
を私はSDURLCache
内で少し掘ってきたし、この方法が有効なデータで応答を返す
私は応答がOSによって処理され、その後AFNetworking
がAFURLConnectionOperation
内部
- (void)connection:(NSURLConnection *)__unused connection
didFailWithError:(NSError *)error
を受けると考えているため、ポイントは、私は、何をすべきか見当がつかない。
私は現在まったく同じ問題に直面しています。あなたは解決策を見つけましたか? – mkto
いいえ、私は畏敬の念を抱くような回避策を講じました.--( – Ecarrion
SDURLCacheをフォークしたピートにメールを送りました。うまくいけば彼に答えがあります。 – mkto