我已经在我的App Delegate中配置了内存和磁盘缓存,但似乎并没有使用缓存-似乎每次都会访问网络。有没有一种简单的方法可以检查是否先缓存了数据,然后在后续请求中对其进行了检索?设置缓存是我所要做的吗?我是否需要通过每次调用cachedResponseForRequest或类似方法来显式检查缓存?它可以在模拟器上运行吗?我的部署目标是iOS 6。

谢谢。

最佳答案

一些观察:

  • 该请求必须是可以缓存的请求(例如httphttps,但不能缓存ftp)。
  • 响应必须生成标头,该标头指示可以缓存响应。值得注意的是,它必须设置Cache-Control。请参阅NSHipster对 NSURLCache 的讨论。

    例如,下载图像时
    <?php
    
    $filename = "image.jpg";
    
    $lastModified = filemtime($filename);
    $etagFile = md5_file($filename);
    
    header('Last-Modified: ' . gmdate("D, d M Y H:i:s", $lastModified) . ' GMT');
    header('Etag: "' . $etagFile . '"');
    header('Content-Type: image/jpeg');
    header('Cache-Control: public, max-age=1835400');
    header('Content-Length: ' . filesize($filename));
    
    readfile($filename);
    
    ?>
    
  • 响应必须满足一些记录不充分的规则(例如,响应不能超过持久性NSURLCache总数的5%)。例如,您可以将以下内容放置在应用程序委托的didFinishLaunchingWithOptions中:
    NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity: 5 * 1024 * 1024
                                                         diskCapacity:20 * 1024 * 1024 diskPath:nil];
    [NSURLCache setSharedURLCache:URLCache];
    

    它将内存缓存设置为5mb,将永久缓存设置为20mb。
  • 为了完整起见,我将说明一个明显的事实,即在创建NSURLRequest时,即使以前已响应,NSURLRequestCachePolicyNSURLRequestReloadIgnoringLocalCacheData也会阻止缓存的使用。
  • 在说明显而易见的类别中,返回connection:willCacheResponse:nil方法将阻止响应被缓存。
  • 关于ios - 如何判断NSURLCache是​​否正常工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16346945/

    10-12 04:55