Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSURLCache是否在发布过程中保持不变?_Ios_Nsurlcache - Fatal编程技术网

Ios NSURLCache是否在发布过程中保持不变?

Ios NSURLCache是否在发布过程中保持不变?,ios,nsurlcache,Ios,Nsurlcache,我正在为我的iOS应用程序寻找一个跨发布持久化的网络缓存解决方案。我开始阅读有关NSURLCache的内容,但没有看到任何关于持久性的内容。当您使用NSURLCache然后关闭并打开应用程序时,是否有人知道这种行为?它是否持续存在?NSURLCache根据服务器的缓存响应、缓存配置和请求的缓存策略,自动缓存通过NSURLConnection和UIWebViews发出的请求。这些响应在缓存的生命周期内存储在内存和磁盘中 在一边 我用以下代码验证了该行为您不需要在自己的代码中使用以下任何一项。这只

我正在为我的iOS应用程序寻找一个跨发布持久化的网络缓存解决方案。我开始阅读有关NSURLCache的内容,但没有看到任何关于持久性的内容。当您使用NSURLCache然后关闭并打开应用程序时,是否有人知道这种行为?它是否持续存在?

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;
}
该代码执行以下操作:

  • 初始化缓存。我注意到一种行为,在缓存初始化并有机会扫描磁盘之前,缓存不会返回缓存结果
  • 创建对长缓存文件的请求
  • 检查URL是否存在响应并显示状态
  • 加载URL

  • 在第一次加载时,您应该看到“未找到缓存响应”。在随后的运行中,您将看到“找到缓存响应!”

    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秒对我来说很好。如果你担心第一个请求的缓存失败,你可以通过多种方式延迟它们。当我关闭应用程序,然后再次打开它,它会丢失整个缓存。我想打开以前访问过的页面。有办法吗?