I'm writing an iPhone application, one of it's tabs is a twitter feed, i'm parsing twitter xml and putting it nicely inside a table view. In case there is no internet connection I would like to show cache results of the last time we had internet connection and the tables were updated. I'm using NSURLCache for that like so:
NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:xmlLink]
cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:60];
NSURLCache *sharedCache = [NSURLCache sharedURLCache];
NSCachedURLResponse *response = [sharedCache cachedResponseForRequest:theRequest];
if (response) {
NSLog(@"Got Response");
} else {
NSLog(@"Didn't got Response");
}
self.objectFeedConnection = [[[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES] autorelease];
I can see that for the first time NSLog outputs "Didn't got response" since it's the first time visiting this website (http://www.twitter.com/...) I can also see that the response is being cached, since i implemented the willCacheResponse method which is being called after the initWithRequest was launched, like so:
- (NSCachedURLResponse *) connection:(NSURLConnection *)connection
willCacheResponse:(NSCachedURLResponse *)cachedResponse
{
NSLog(@"willCache Reponse");
NSCachedURLResponse *newCachedResponse = nil;
if ([[[[cachedResponse response] URL] scheme] isEqual:@"http"]) {
newCachedResponse = [[[NSCachedURLResponse alloc]
initWithResponse:[cachedResponse response]
data:[cachedResponse data]
userInfo:nil
storagePolicy:[cachedResponse storagePolicy]]
autorelease];
}
return newCachedResponse;
}
The second time i visit this site i can clearly see that NSLog outputs "Got Response" which means that there was a cache hit, hence willCacheResponse should not be called again, but for some strange reason it is called again and again and does not pull the information out of the cache, instead it try to cache it again.
Any idea what causing this issue ?
Thanks!
OP probably doesn't care any more, but for anyone else playing with this - You should look at the HTTP headers being returned in the response. NSURLCache will check the headers to decide if it can use the thing returned from the cache. Cache-Control: Last-Modified: Etag: etc.