如何判断NSURLCache是​​否正常工作?

时间:2013-05-02 20:16:06

标签: ios ios6 nsurlconnection nsurlcache

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

感谢。

1 个答案:

答案 0 :(得分:4)

有几点意见:

  1. 请求必须是可以缓存的请求(例如httphttps,而不是ftp。)

  2. 响应必须生成标题,指示可以缓存响应。值得注意的是,它必须设置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);
    
    ?>
    
  3. 响应必须满足一些记录不完整的规则(例如,响应不能超过总持久性NSURLCache的5%)。例如,您可以将以下内容放在应用委托的didFinishLaunchingWithOptions

    NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity: 5 * 1024 * 1024
                                                         diskCapacity:20 * 1024 * 1024 diskPath:nil];
    [NSURLCache setSharedURLCache:URLCache];
    

    设置5mb的内存缓存和20mb的持久缓存。

  4. 为了完整起见,我将明确指出,在创建NSURLRequest时,NSURLRequestCachePolicy NSURLRequestReloadIgnoringLocalCacheData会阻止缓存被使用,即使响应以前是缓存的。

  5. 在说明显而易见的同一类别中,返回connection:willCacheResponse:的{​​{1}}方法会阻止响应被缓存。