Можно ли предотвратить NSURLRequest от кэширования данных или удалить кэшированные данные после запроса? - PullRequest
86 голосов
/ 01 января 2009

На iPhone я выполняю HTTP-запрос, используя NSURLRequest для фрагмента данных. Пики распределения объектов, и я назначаю данные соответственно. Когда я заканчиваю с данными, я освобождаю их соответствующим образом - однако инструменты не показывают никаких данных, которые должны были быть освобождены!

Моя теория состоит в том, что по умолчанию кэшируются HTTP-запросы - я не хочу, чтобы мое приложение для iPhone кэшировало эти данные.

Есть ли способ очистить этот кеш после запроса или предотвратить кеширование данных?

Я попытался использовать все описанные ниже политики кэширования, как показано ниже:

NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
theRequest.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;

но, кажется, ничто не освобождает память!

Ответы [ 6 ]

153 голосов
/ 02 января 2009

Обычно такой запрос создать проще

NSURLRequest *request = [NSURLRequest requestWithURL:url
      cachePolicy:NSURLRequestReloadIgnoringCacheData
      timeoutInterval:60.0];

Затем создайте соединение

NSURLConnection *conn = [NSURLConnection connectionWithRequest:request
       delegate:self];

и реализовать соединение: willCacheResponse: метод на делегате. Просто возвращение ноль должно сделать это.

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse {
  return nil;
}
12 голосов
/ 08 октября 2009

У меня такая же проблема в приложении, когда я запрашивал информацию из твиттера. В моем случае мне не нужно было сохранять эти учетные данные, поэтому я просто удалил их, используя следующий код:

- (void) eraseCredentials{
NSURLCredentialStorage *credentialsStorage = [NSURLCredentialStorage sharedCredentialStorage];
NSDictionary *allCredentials = [credentialsStorage allCredentials];

//iterate through all credentials to find the twitter host
for (NSURLProtectionSpace *protectionSpace in allCredentials)
    if ([[protectionSpace host] isEqualToString:@"twitter.com"]){
        //to get the twitter's credentials
        NSDictionary *credentials = [credentialsStorage credentialsForProtectionSpace:protectionSpace];
        //iterate through twitter's credentials, and erase them all
        for (NSString *credentialKey in credentials)
            [credentialsStorage removeCredential:[credentials objectForKey:credentialKey] forProtectionSpace:protectionSpace];
    }
}

Надеюсь, у кого-нибудь это получится:)

10 голосов
/ 02 января 2009

Если вы используете NSURLConnection, взгляните на делегата:

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse

Возвращаемое значение

Фактический кешированный ответ для хранения в кеше. Делегат может вернуть cachedResponse без изменений, вернуть измененный кэшированный ответ или вернуть nil, если для соединения не следует хранить кэшированный ответ.

7 голосов
/ 09 октября 2016

Если вы используете NSURLSession, другое решение, предотвращающее запись запроса и параметров в Cache.db iOS, создаваемое в каталоге приложения Caches, - установить NSURLCache для конфигурации сеанса на 0 памяти и 0 дискового кеша например

let configuration = URLSessionConfiguration.default    
configuration.urlCache = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)
let session = URLSession(configuration: configuration)

или как указано выше установлено на уровне глобального кэша

URLCache.shared = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)

Предположительно, это 0 для размера диска, который останавливает запись iOS на диск, но если у вас есть политика к reloadIgnoringLocalCacheData, то вы, вероятно, также не заинтересованы в кэшировании памяти.

Примечание Это предотвратит создание любой папки Caches/Cache.db (запросы и ответы) или Caches/fsCachedData/ (данные ответов). Мы решили использовать этот подход в приложении в целях безопасности, поскольку не хотим, чтобы наши запросы хранились в кеше диска.

Если кто-нибудь знает, что есть способ остановить только кэширование запросов, но сохранить кэширование данных ответов с помощью механизма загрузки URL-адресов iOS, мне было бы интересно узнать. (по этому поводу нет API или официальной документации)

7 голосов
/ 30 июня 2014

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

        int cacheSizeMemory = 0*4*1024*1024; // 0MB
        int cacheSizeDisk = 0*32*1024*1024; // 0MB
        NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"];
        [NSURLCache setSharedURLCache:sharedCache];
0 голосов
/ 15 августа 2017
NSMutableURLRequest* request = [[NSMutableURLRequest alloc] url];
[request setValue:@"no-store" forHTTPHeaderField:@"Cache-Control"];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];

При условии, что сервер реализован правильно, размещение заголовка Cache-Control:no-store в запросе приведет к созданию ответа сервера с таким же заголовком, в результате чего NSURLCache не сохранит данные ответа на диске.

Следовательно, нет необходимости в подходе дробовика для отключения NSURLCache кэширования диска.

PS: Добавление заголовка должно работать для всех HTTP-фреймворков, например AFNetworking

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...