2013-05-02 2 views
2

Я сконфигурировал кеш памяти и диска в своем делете приложения, но похоже, что кеш используется - кажется, каждый раз он идет в сеть. Есть ли простой способ проверить, кэшируются ли данные и затем извлекаются при последующих запросах? Является ли настройка кеша все, что мне нужно? Нужно ли явно проверять кеш, вызывая каждый раз вызов cachedResponseForRequest или что-то в этом роде? Работает ли он на симуляторе? Моей целью развертывания является iOS 6.Как узнать, работает ли NSURLCache?

Спасибо.

ответ

4

Несколько наблюдений:

  1. Запрос должен быть один, который может быть в кэше (например http или https, но не 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. ответ должен удовлетворять некоторые плохо документированные правила (например, ответ не может превышать 5% от общих постоянная NSURLCache). Например, вы можете поместить следующее приложение делегата didFinishLaunchingWithOptions:

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

    Это устанавливает кэш памяти 5mb и постоянный кэш 20МБ.

  4. Для полноты картины, я буду констатировать очевидное, что при создании NSURLRequest, NSURLRequestCachePolicy из NSURLRequestReloadIgnoringLocalCacheData будет препятствовать кэш от использования, даже если ответ был в кэше.

  5. В той же категории с указанием очевидности, метод connection:willCacheResponse:, который возвратил nil, предотвратил бы кеширование ответа.

Смежные вопросы