NSURLCache не очищает сохраненные ответы в iOS8
Вот примерная функция, которую я вызываю, когда мне нужно очистить кеш и сделать новый вызов URL
- (void)clearDataFromNSURLCache:(NSString *)urlString
{
NSURL *requestUrl = [NSURL URLWithString:urlString];
NSURLRequest *dataUrlRequest = [NSURLRequest requestWithURL: requestUrl];
NSURLCache * cache =[NSURLCache sharedURLCache];
NSCachedURLResponse* cacheResponse =[cache cachedResponseForRequest:dataUrlRequest];
if (cacheResponse) {
NSString* dataStr = [NSString stringWithUTF8String:[[cacheResponse data] bytes]];
NSLog(@"data str r= %@",dataStr);
NSLog(@"url str r= %@",[[[cacheResponse response] URL] absoluteString]);
[cache storeCachedResponse:nil forRequest:dataUrlRequest];
[NSURLCache setSharedURLCache:cache];
}
[[NSURLCache sharedURLCache] removeCachedResponseForRequest:dataUrlRequest];
//Check if the respnase data has been removed/deleted from cache
NSURLRequest *finalRequestUrlRequest = [NSURLRequest requestWithURL:requestUrl];
NSURLCache * finalCache =[NSURLCache sharedURLCache];
NSCachedURLResponse* finalcacheResponse =[finalCache cachedResponseForRequest:finalRequestUrlRequest];
if (finalcacheResponse) {
//Should not enter here
NSString* finaldataStr = [NSString stringWithUTF8String:[[finalcacheResponse data] bytes]];
NSLog(@"data str r= %@",finaldataStr);
NSLog(@"url str r= %@",[[[cacheResponse response] URL] absoluteString]);
}
}
В iOS 6/7 ответ удаляется успешно для requestURL, но в iOS 8 он никогда не удаляется.
Я искал, но не мог найти причину, почему это не должно работать в iOS8.
Любая помощь будет оценена.....
Ответы
Ответ 1
NSURLCache
разбит на iOS 8.0.x - он никогда не очищает кеш вообще, поэтому он растет без ограничений. Подробнее см. http://blog.airsource.co.uk/2014/10/11/nsurlcache-ios8-broken/. Очистка кеша фиксируется в бета-версии 8.1, но removeCachedResponseForRequest:
нет.
removeCachedResponsesSinceDate:
действительно работает на iOS 8.0 - API, который был добавлен для 8.0, но еще не дошел до документов (он находится в API-интерфейсах). Я не понимаю, что это для кого угодно - конечно, что вы обычно хотите сделать, это удалить кешированные ответы до определенной даты.
removeAllCachedResponses
работает также, но это реальное решение кувалды.
Ответ 2
Я получил достаточный результат, сбрасывая кешированный ответ для определенного URL-адреса, изменяя элемент управления кэша на то, что никогда не будет возвращено, как "max-age = 0" в заголовке. Посмотрите здесь