На iPhone я выполняю HTTP-запрос, используя NSURLRequest для фрагмента данных. Пики распределения объектов, и я соответствующим образом назначаю данные. Когда я заканчиваю с данными, я освобождаю их соответственно - однако инструменты не показывают никаких данных, которые были освобождены!
Моя теория заключается в том, что по умолчанию HTTP-запросы кешируются, однако я не хочу, чтобы мое приложение для iPhone кэшировало эти данные.
Есть ли способ очистить этот кеш после запроса или вообще предотвратить кеширование каких-либо данных?
Я пробовал использовать все политики кеширования, описанные ниже:
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
theRequest.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
но вроде ничего не освобождает память!
cocoa-touch
caching
Ник Картрайт
источник
источник
Ответы:
Обычно такой запрос проще создать
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0];
Затем создайте соединение
NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
и реализуйте метод connection: willCacheResponse: для делегата. Просто возврат nil должен сделать это.
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse { return nil; }
источник
NSURLRequestReloadIgnoringCacheData
и осуществитьconnection:willCacheResponse:
?connection:willCacheResponse:
позволяет не сохранять ответ в кеше.NSURLRequestReloadIgnoringCacheData
указывает, что соединение должно загружать запрос без проверки кеша. По-видимому, первое помогает управлять распределением памяти.У меня такая же проблема в приложении, когда я запрашивал информацию в твиттере. В моем случае мне не нужно было сохранять эти учетные данные, поэтому я просто стираю их, используя следующий код:
- (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]; } }
Надеюсь, у кого-то это сработает :)
источник
Если вы используете NSURLConnection, посмотрите на делегата:
- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse
Возвращаемое значение
Фактический кешированный ответ для сохранения в кеше. Делегат может возвращать cachedResponse без изменений, возвращать измененный кешированный ответ или возвращать nil, если кэшированный ответ не должен храниться для соединения.
источник
Если вы используете
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 или официальной документации)
источник
Если не относится к одному запросу (вы хотите отключить кеш для всего приложения), то лучшим вариантом будет один ниже. Добавьте этот код в делегат приложения или в зависимости от того, где вам нужно
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];
источник
NSMutableURLRequest* request = [[NSMutableURLRequest alloc] url]; [request setValue:@"no-store" forHTTPHeaderField:@"Cache-Control"]; [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
Предполагая, что сервер реализован правильно, размещение
Cache-Control:no-store
заголовка в запросе вызовет ответ сервера с тем же заголовком, что приведетNSURLCache
к тому, что данные ответа не будут сохранены на диске.Следовательно, нет необходимости в дробном подходе к отключению
NSURLCache
кеширования диска.PS: добавление заголовка должно работать для всех фреймворков HTTP, например
AFNetworking
источник