2013-05-02 77 views
2

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

谢谢。

回答

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时状态明显,即,中NSURLRequestReloadIgnoringLocalCacheData一个NSURLRequestCachePolicy将防止缓存即使响应先前被缓存使用。

  5. 在陈述明显的同一类别中,返回nilconnection:willCacheResponse:方法将阻止响应被缓存。