我正在使用我的应用程序中的ASIHttpRequest库,我正在尝试为特定请求设置缓存,以便它可以在一段时间内使用(如果没有可用的数据)服务器或没有互联网连接),除此之外它将拒绝/删除缓存,因此不会使用它。
所以我试图得到的请求是,首先检查它是否可以在线检索数据,如果它无法访问它(无论出于何种原因,服务器已关闭或没有互联网连接可用),那么使用缓存,只要它没有过期。我希望将缓存设置为一定时间,例如12小时后将数据保存到缓存中。
到目前为止我尝试的是:
// Set secondsToCache on the request to override any expiry date for the content set by the server, and store
// this response in the cache until secondsToCache seconds have elapsed
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setSecondsToCache:60*60*24*30]; // Cache for 30 days
这取自网站上的例子。
然而,如上所述,这似乎没有我想要的效果。
如何在一段时间内缓存数据,之后将其从缓存中删除?
答案 0 :(得分:0)
尝试在canUseCachedDataForRequest
的{{1}}中设置断点;单步执行并查看代码采用的路径。
它应该跟随一个调用ASIDownloadCache.m
的路径,如果数据已经过期,它应该返回NO。
从code看来,'setSecondsToCache'应该在缓存对象中设置“X-ASIHTTPRequest-Expires”标头,这应该使isCachedDataCurrentForRequest返回NO - 我认为只有通过调试才能告诉在这种情况下,你的情况会出现问题。
答案 1 :(得分:0)
我有同样的问题。方法[request setSecondsToCache:xxx]似乎不适用于过期,它也不适用于缓存。如果你没有设置
[request setCachePolicy:ASIOnlyLoadIfNotCachedCachePolicy];
会话结束后,缓存将被删除。
答案 2 :(得分:0)
可能有点旧,但我的代码仍在使用ios7。
-(NSData*)getResponseAsDataFromUrl:(NSURL*)sourceUrl andWithCachePolicy:(ASICachePolicy)cachePolicy andWithExpireDurationInSeconds:(NSTimeInterval)expireDuration{
ASIHTTPRequest* request = [[ASIHTTPRequest alloc] initWithURL:sourceUrl];
[request setCachePolicy:cachePolicy];
[request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
[request setTimeOutSeconds:30];
//We set the expireduration to a second we desire
[request setSecondsToCache:expireDuration];
NSError* error = [request error];
NSData* jsonData;
NSDictionary* cachedHeaderDict = [[ASIDownloadCache sharedCache] cachedResponseHeadersForURL:sourceUrl];
NSDate* expireDate = [NSDate date];
NSDate* now = [NSDate date];
if([[cachedHeaderDict allKeys] containsObject:@"X-ASIHTTPRequest-Expires"]){
NSNumber* cacheInterval = [cachedHeaderDict objectForKey:@"X-ASIHTTPRequest-Expires"];
expireDate = [[NSDate alloc] initWithTimeIntervalSince1970:cacheInterval.doubleValue];
}
switch ([now compare:expireDate]) {
case -1:{
// NSLog(@"Cache has not been expired. Using cached response.");
jsonData = [[NSData alloc] initWithContentsOfFile:[[ASIDownloadCache sharedCache] pathToCachedResponseDataForURL:sourceUrl]];
}
break;
default:{
// NSLog(@"Cache expired. Cleaning cached data.");
[[ASIDownloadCache sharedCache] removeCachedDataForRequest:request];
}
break;
}
if(!jsonData){
[request startSynchronous];
if(!error){ //If there is no error, use the data
jsonData = [request responseData];
if(!jsonData)//This is here for cases where we get empty response and we dont want to store empty responses.
[[ASIDownloadCache sharedCache] removeCachedDataForRequest:request];
}else{
NSLog(@"no response: %@",error.description);
[[ASIDownloadCache sharedCache] removeCachedDataForRequest:request];
}
[request clearDelegatesAndCancel];
request = nil;
}
return jsonData;
}