iOS应用程序终止后NSURLCache无法正常工作

时间:2014-09-02 12:34:50

标签: ios caching nsurlrequest nsurlcache nsurlrequestcachepolicy

我正在构建一个我正在实现离线模式的应用程序。为此,我使用了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方法更改每个请求。

请帮我找到解决方法。 提前谢谢....

0 个答案:

没有答案