我正在构建一个我正在实现离线模式的应用程序。为此,我使用了NSURLCache机制。当应用程序处于前台时,即使设备进入脱机模式,缓存机制也能正常工作。当我退出应用程序然后在离线模式下打开它时,问题就出现了。这次NSCachedURLResponse为特定请求返回nil。
以下是我正在使用的代码:
自定义缓存创建:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSURLCache *urlCache = [[NSURLCache alloc] initWithMemoryCapacity:1024*1024 diskCapacity:1024*1024*5 diskPath:nil];
[NSURLCache setSharedURLCache:urlCache];
}
调用服务器和缓存对象:
-(void)serverCall
{
NSURLCache *urlCache = [NSURLCache sharedURLCache];
NSString *urlString = nil;
NSHTTPURLResponse *response = nil;
NSError *error = nil;
urlString = [NSString stringWithFormat:@"%@%@",BASE_URL,url];
urlString = [urlString stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
NSURL *finalUrl = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:finalUrl];
request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;
NSData *data = nil;
if ([self checkInternetConnection])
{
data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:response data:data];
[urlCache storeCachedResponse:cachedResponse forRequest:request];
}
else
{
NSCachedURLResponse *cachedResponse = [urlCache cachedResponseForRequest:request];
response = cachedResponse.response;
data = cachedResponse.data;
}
}
我可以看到应用程序库路径中的caches.db保存了响应。但是当我试图在离线模式下读取它(在应用程序被从后台杀死后)时,缓存的响应将变为零。我已经通过以下链接(以及更多),但找不到我的问题的解决方案。
NSURLCache Problem with cache response
How to use NSURLCache to return cached API responses when offline (iOS App)
http://twobitlabs.com/2012/01/ios-ipad-iphone-nsurlcache-uiwebview-memory-utilization/
http://petersteinberger.com/blog/2012/nsurlcache-uses-a-disk-cache-as-of-ios5/
Bypassing http response header Cache-Control: how to set cache expiration?
我检查了api响应中的http头字段和缓存头,问题不是来自服务器端。
我还尝试在创建自定义缓存时在diskPath参数中提供路径,但是当应用程序处于前台并且互联网断开连接时,它甚至不会加载缓存的对象。我也改变了有效期,但工作仍然相同。
我尝试过使用SDURLCache,但我遇到了类似的问题。但是我已经使用ASIHTTPRequest成功实现了这一点,但我不想使用它,因为我已经编写了所有服务器操作,我必须使用ASIHTTPRequest方法更改每个请求。
请帮我找到解决方法。 提前谢谢....