来自服务器的所有 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 秒。