Понимание доступа кэша

Загрузочная система URL обеспечивает составной объект, дисковый и в кэше памяти из ответов на запросы. Этот кэш позволяет приложению сокращать свою зависимость от сетевого соединения и увеличивать его производительность.

Используя кэш для запроса

NSURLRequest экземпляр указывает, как локальный кэш используется путем установки политики кэша в один из NSURLRequestCachePolicy значения: NSURLRequestUseProtocolCachePolicy, NSURLRequestReloadIgnoringCacheData, NSURLRequestReturnCacheDataElseLoad, или NSURLRequestReturnCacheDataDontLoad.

Политика кэша по умолчанию для NSURLRequest экземпляр NSURLRequestUseProtocolCachePolicy. NSURLRequestUseProtocolCachePolicy поведение является определенным протоколом и определяется как являющийся лучшей политикой приспосабливания для протокола.

Установка политики кэша к NSURLRequestReloadIgnoringCacheData заставляет загрузочную систему URL загружать данные из инициирующего источника, игнорируя кэш полностью.

NSURLRequestReturnCacheDataElseLoad политика кэша заставляет загрузочную систему URL использовать кэшированные данные, игнорируя его возраст или дату истечения срока, и загружать данные из инициирующего источника, только если нет никакой кэшированной версии.

NSURLRequestReturnCacheDataDontLoad политика позволяет приложению указывать, что только должны быть возвращены данные в кэше. Попытка создать NSURLConnection или NSURLDownload экземпляр с этой политикой кэша возвраты nil сразу, если ответ не находится в локальном кэше. Это подобно в функции «оффлайновому» режиму и никогда не переводит сетевое соединение в рабочее состояние.

Семантика использования кэша для протокола HTTP

Когда запрос использует протокол HTTP и установил политику кэша в, самая сложная ситуация с использованием кэша состоит в том NSURLRequestUseProtocolCachePolicy.

Если NSCachedURLResponse не существует для запроса, тогда загрузочная система URL выбирает данные из инициирующего источника.

Если кэшируемый ответ существует для запроса, загрузочная система URL проверяет ответ, чтобы определить, указывает ли это, что должно быть подтверждено содержание.

Если содержание должно быть подтверждено, загрузочная система URL выполняет запрос HEAD к инициирующему источнику, чтобы видеть, изменился ли ресурс. Если это не изменилось, то загрузочная система URL возвращает кэшируемый ответ. Если это изменилось, загрузочная система URL выбирает данные из инициирующего источника.

Если кэшируемый ответ не указывает, что содержание должно быть подтверждено, загрузочная система URL исследует максимальный возраст или истечение срока, указанное в кэшируемом ответе. Если кэшируемый ответ является достаточно недавним, то загрузочная система URL возвращает кэшируемый ответ. Если ответ является устаревшим, загрузочная система URL выполняет запрос HEAD к инициирующему источнику, чтобы определить, изменился ли ресурс. Если так, загрузочная система URL выбирает ресурс из инициирующего источника. Иначе, это возвратило кэшируемый ответ.

RFC 2616, Раздел 13 (http://www .w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13) указывает семантику, включенную подробно.

Управление кэшированием программно

По умолчанию данные для соединения кэшируются на основе политики кэша запроса, как интерпретируется NSURLProtocol подкласс, обрабатывающий запрос.

Если для Вашего приложения нужно более точное программируемое управление кэшированием (и если кэширование поддержки протоколов), можно реализовать метод делегата, позволяющий приложению определять на основе на запрос, должен ли кэшироваться определенный ответ.

Для NSURLSession, Ваш метод делегата вызывает блок обработчика завершения для сообщения сеанса, что кэшироваться. Для NSURLConnection, Ваш метод делегата возвращает объект, который должно кэшировать соединение.

В любом случае делегат обычно обеспечивает один следующие значения:

Ваш метод делегата может также вставить объекты в userInfo словарь связался с NSCachedURLResponse объект, заставляя те объекты быть сохраненным в кэше как часть ответа.

Пример в Перечислении 7-1 предотвращает дисковое кэширование ответов HTTPS. Это также добавляет текущую дату к пользовательскому информационному словарю для кэширующихся ответов.

  Пример перечисления 7-1 connection:withCacheResponse: реализация

-(NSCachedURLResponse *)connection:(NSURLConnection *)connection
                 willCacheResponse:(NSCachedURLResponse *)cachedResponse
{
    NSCachedURLResponse *newCachedResponse = cachedResponse;
 
    NSDictionary *newUserInfo;
    newUserInfo = [NSDictionary dictionaryWithObject:[NSDate date]
                                                 forKey:@"Cached Date"];
    if ([[[[cachedResponse response] URL] scheme] isEqual:@"https"]) {
#if ALLOW_IN_MEMORY_CACHING
        newCachedResponse = [[NSCachedURLResponse alloc]
                                initWithResponse:[cachedResponse response]
                                    data:[cachedResponse data]
                                    userInfo:newUserInfo
                                    storagePolicy:NSURLCacheStorageAllowedInMemoryOnly];
#else // !ALLOW_IN_MEMORY_CACHING
        newCachedResponse = nil
#endif // ALLOW_IN_MEMORY_CACHING
    } else {
        newCachedResponse = [[NSCachedURLResponse alloc]
                                initWithResponse:[cachedResponse response]
                                    data:[cachedResponse data]
                                    userInfo:newUserInfo
                                    storagePolicy:[cachedResponse storagePolicy]];
    }
    return newCachedResponse;
}