サーバーからのすべての http 応答には、応答をキャッシュしないようにアプリに通知するヘッダーが付属しています。
Cache-Control: no-cache
Pragma: no-cache
Expires: 0
そのため、デフォルトのキャッシュ ポリシー「NSURLRequestUseProtocolCachePolicy」で NSUrlRequests を作成している場合、アプリは常にサーバーからデータを読み込みます。ただし、応答をキャッシュする必要があり、明らかな解決策は、これらのヘッダーをたとえば (バックエンド側で) 10 秒に設定するなどの時間に設定することです。しかし、このポリシーをバイパスしてすべてのリクエストを 10 秒間キャッシュする方法に興味があります。
そのためには、共有キャッシュをセットアップする必要があります。これは、AppDelegate didFinishLaunchingWithOptions で行うことができます。
NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024
diskCapacity:20 * 1024 * 1024
diskPath:nil];
[NSURLCache setSharedURLCache:URLCache];
次に、応答を強制的にキャッシュするコードを埋め込む必要があります。AFHttpClient のインスタンスを使用する場合は、以下のメソッドをオーバーライドし、手動でキャッシュを共有キャッシュに格納することで実行できます。
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection
willCacheResponse:(NSCachedURLResponse *)cachedResponse {
NSMutableDictionary *mutableUserInfo = [[cachedResponse userInfo] mutableCopy];
NSMutableData *mutableData = [[cachedResponse data] mutableCopy];
NSURLCacheStoragePolicy storagePolicy = NSURLCacheStorageAllowedInMemoryOnly;
// ...
return [[NSCachedURLResponse alloc] initWithResponse:[cachedResponse response]
data:mutableData
userInfo:mutableUserInfo
storagePolicy:storagePolicy];
}
最後に、リクエストの cachePolicy を設定します。この場合、すべてのリクエストに同じキャッシュ ポリシーを設定します。繰り返しますが、AFHttpClient のインスタンスを使用する場合は、以下のメソッドをオーバーライドすることで実行できます。
- (NSMutableURLRequest *)requestWithMethod:(NSString *)method path:(NSString *)path parameters:(NSDictionary *)parameters {
NSMutableURLRequest *request = [super requestWithMethod:method path:path parameters:parameters];
request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;
return request;
}
ここまでは順調ですね。「NSURLRequestReturnCacheDataElseLoad」は、最初にリクエストを実行し、それ以外の場合はキャッシュからレスポンスをロードします。問題は、キャッシュの有効期限 (たとえば 10 秒) を設定する方法が不明であることです。