Подтвердить что ты не робот

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.

Любая помощь будет оценена.....

4b9b3361

Ответ 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" в заголовке. Посмотрите здесь