Ios NSURLCache是否在发布过程中保持不变?
我正在为我的iOS应用程序寻找一个跨发布持久化的网络缓存解决方案。我开始阅读有关NSURLCache的内容,但没有看到任何关于持久性的内容。当您使用NSURLCache然后关闭并打开应用程序时,是否有人知道这种行为?它是否持续存在?Ios NSURLCache是否在发布过程中保持不变?,ios,nsurlcache,Ios,Nsurlcache,我正在为我的iOS应用程序寻找一个跨发布持久化的网络缓存解决方案。我开始阅读有关NSURLCache的内容,但没有看到任何关于持久性的内容。当您使用NSURLCache然后关闭并打开应用程序时,是否有人知道这种行为?它是否持续存在?NSURLCache根据服务器的缓存响应、缓存配置和请求的缓存策略,自动缓存通过NSURLConnection和UIWebViews发出的请求。这些响应在缓存的生命周期内存储在内存和磁盘中 在一边 我用以下代码验证了该行为您不需要在自己的代码中使用以下任何一项。这只
NSURLCache
根据服务器的缓存响应、缓存配置和请求的缓存策略,自动缓存通过NSURLConnection
和UIWebView
s发出的请求。这些响应在缓存的生命周期内存储在内存和磁盘中
在一边 我用以下代码验证了该行为您不需要在自己的代码中使用以下任何一项。这只是为了证明我是如何确认这一行为的。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Prime the cache.
[NSURLCache sharedURLCache];
sleep(1); // Again, this is for demonstration purposes only. I wouldn't do this in a real app.
// Choose a long cached URL.
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://cdn.sstatic.net/stackoverflow/img/favicon.ico"]];
// Check the cache.
NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request];
NSLog(cachedResponse ? @"Cached response found!" : @"No cached response found.");
// Load the file.
[NSURLConnection sendSynchronousRequest:request returningResponse:NULL error:NULL];
return YES;
}
该代码执行以下操作:
在第一次加载时,您应该看到“未找到缓存响应”。在随后的运行中,您将看到“找到缓存响应!”Yes。更清楚地说,无论何时使用
NSURLConnection
,它都会根据缓存策略和响应缓存头在内存和磁盘上缓存结果。磁盘缓存意味着跨负载的持久性,我可以亲自验证这种行为。@Rob如果内存可用,NSURLCache
行为在iOS 5中发生了变化,这也是苹果开始区分操作系统可能随时删除的文件的时候,应通过iCloud进行同步的文件以及上述两种情况均不正确的文件。那么,你的数据源可能来自5岁以前的世界吗?@Tommy做了一点研究,我发现持久存储缓存很挑剔,但在iOS中可以工作。我发现,如果(a)使用NSURLRequestUseProtocolCachePolicy
的默认NSURLRequest
cachePolicy
,它将不会缓存到持久存储;但是(b)响应不包括缓存控制
头。但是,如果您使用NSURLRequestReturnCacheDataElseLoad的cachePolicy
,或者如果来自服务器的响应指定特定的缓存控制
头(例如public,max age=1835400
),它将缓存到持久存储。或者您也可以手动添加到NSURLCache
。您的措辞可能会令人困惑。如果我错了,请纠正我:一般来说:缓存和持久性是正交的。缓存是为了提高性能,根据需要可以持久化,也可以不持久化。持久化就是“如何在应用程序重启期间持久化任何数据?”任何持久化技术都可以用作持久化“缓存”数据的后端。因为缓存数据只是数据。术语“缓存”只是传达数据的预期用例。具体来说:这里你说的是通过不同的启动来持久化缓存,我认为这是正确的。感谢你的示例代码。你使用cachedResponseForRequest只是为了证明响应是缓存的吗?你是否需要在每次启动时都使用cachedResponseForRequestant是否要命中缓存?我认为如果您连续调用sendSynchronousRequest,根据NSURLRequest上设置的缓存策略,它会自动命中缓存。不是这样吗?抱歉,cachedResponseForRequest:
调用只是为了证明值已被缓存。您不需要我有一个特殊的缓存处理代码来让你的缓存工作。我会相应地更新我的答案。为什么睡眠(1)行如此重要?我有一个演示下载应用程序,在我将此类代码放入更复杂的应用程序之前,我已经构建了该应用程序,以展示/验证缓存代码。如果我不添加睡眠(1)在我的应用程序中,delegate在[NSURLCache setSharedURLCache:sharedCache]之后使用options
方法完成了启动;
然后整个缓存系统就坏了。它不工作。但是,如果我像上面描述的那样睡在我的应用程序中,boom,整个系统就会完美地工作。我应该接受这种奇怪的睡眠吗(1)在我的生产应用程序中需要调用,或者有其他技术可以做到这一点吗?@JohnErck你基本上只需要一些时间让缓存在发出第一个请求之前进行初始化,1秒对我来说很好。如果你担心第一个请求的缓存失败,你可以通过多种方式延迟它们。当我关闭应用程序,然后再次打开它,它会丢失整个缓存。我想打开以前访问过的页面。有办法吗?