NSURLCache Объем памяти равен нулю - PullRequest
4 голосов
/ 28 января 2010

У меня проблемы с кэшированием ответов NSURLConnection с использованием синхронного вызова. Я инициализирую кеш в одном классе, а затем использую его в другом. Обратите внимание, как объем кэш-памяти инициализируется до 100 КБ, но затем магически сбрасывается в ноль позже.

- (id)init {
    if (self = [super init]) {
         // Creates a custom URL cache that uses both memory and disk.
         NSURLCache *sharedCache = 
         [[NSURLCache alloc] initWithMemoryCapacity:kMemoryCacheSize * 1000000 
         diskCapacity:kDiskCacheSize * 1000000 
         diskPath:diskPath];
         [NSURLCache setSharedURLCache:sharedCache];

        NSLog(@"Cache memory capacity = %d bytes", [[NSURLCache sharedURLCache] memoryCapacity]);
        NSLog(@"Cache disk capacity = %d bytes", [[NSURLCache sharedURLCache] diskCapacity]);

        //[sharedCache release];
    }
    return self;
}
// NSLOG OUTPUT:
// [6842:20b] Cache memory capacity = 100000 bytes
// [6842:20b] Cache disk capacity = 20000000 bytes

В другом классе ...

NSLog(@"Cache memory capacity = %d bytes", [[NSURLCache sharedURLCache] memoryCapacity]);
NSLog(@"Cache disk capacity = %d bytes", [[NSURLCache sharedURLCache] diskCapacity]);
NSLog(@"Cache Memory Usage = %d bytes", [[NSURLCache sharedURLCache] currentMemoryUsage]);
NSLog(@"Cache Disc Usage = %d bytes", [[NSURLCache sharedURLCache] currentDiskUsage]);
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:objectURL cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:20];
data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSLog(@"Image Request finished. Error = %@",[error localizedDescription]);
NSLog(@"Cache size after = %d bytes", [[NSURLCache sharedURLCache] currentMemoryUsage]);
// NSLog Output:
// Cache memory capacity = 0 bytes
// Cache Disc Usage = 0 bytes
// Cache Memory Usage = 0 bytes
// Cache disk capacity = 20000000 bytes
// Image Request finished. Error = (null)
// Cache size after = 0 bytes

Ответы [ 3 ]

4 голосов
/ 03 октября 2010

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

что-то вроде:

-(void)setMemoryCapacity:(NSUInteger)memCap
{
    if (memCap == 0)
        return;
   [super setMemoryCapacity:memCap];
}
1 голос
/ 28 января 2010

Я бы добавил "% p" и [NSURLCache sharedURLCache] в ваши операторы NSLog, чтобы убедиться, что общий объект остается прежним. Затем я бы добавил точки останова для + [NSURLCache setSharedURLCache:] и - [NSURLCache setMemoryCapacity:], чтобы увидеть, что происходит.

0 голосов
/ 26 мая 2011

Была такая же проблема здесь. Кэширование мыслей вообще не работает. После настройки небольшого тестового проекта без UIWebView [NSURLCache sharedURLCache] memoryCapacity] возвращает ожидаемое 10000000 вместо 0.

К счастью, кэш не будет очищен, все ранее кэшированные объекты останутся. Так что решение Дуга работает как шарм!

Кстати: после показа веб-страницы размер будет установлен на ноль. После этого установите значение 10000000, показывая, что веб-представление больше не будет устанавливать размер на ноль.

...