2012-05-30 9 views
0

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

кэш является глобальной, объявленный в .h: NSCache *cache;

-(UIImage *)buscarEnCache:(UsersController *)auxiliarStruct{ 
    UIImage *image; 
    [[cache alloc] init]; 

    NSLog(@"cache: %i", [cache countLimit]); 
    if ([cache countLimit] > 0) { //if [cache countLimit]>0, it means that cache isn't empty and this is executed 
     if ([cache objectForKey:auxiliarStruct.thumb]){  
      image = [cache objectForKey:auxiliarStruct.thumb]; 
     }else{ //IF isnt't cached, is saved 
      NSString *imageURLString = [NSString stringWithFormat:@"http://mydomain.com/%@",auxiliarStruct.thumb]; 
      NSURL *imageURL = [NSURL URLWithString:imageURLString]; 
      NSData * imageData = [NSData dataWithContentsOfURL:imageURL]; 
      image = [UIImage imageWithData:imageData]; 
      [cache setObject:image forKey:auxiliarStruct.thumb]; 
     }   
    }else{ //This if is executed when cache is empty. IS ALWAYS EXECUTED BECAUSE FIRST IF DOESN'T WORKS CORRECTLY 
     NSString *imageURLString = [NSString stringWithFormat:@"http://mydomain.com/%@",auxiliarStruct.thumb]; 
     NSURL *imageURL = [NSURL URLWithString:imageURLString]; 
     NSData * imageData = [NSData dataWithContentsOfURL:imageURL]; 
     image = [UIImage imageWithData:imageData]; 
     [cache setObject:image forKey:auxiliarStruct.thumb]; 
    } 
    return image; 
} 

Эта функция вызывается в другой функции с этим:

 UIImage *image = [self buscarEnCache:auxiliarStruct]; 

Это работает, потому что изображение отображается на экране, но не сохраняется в кеше, линия, которая, как мне кажется, не работает:

[cache setObject:image forKey:auxiliarStruct.thumb]; //auxiliarStruct.thumb is the name of the image

Кто-то знает, почему кеш не работает? Благодаря!!

пс: простите за мой английский, я знаю, что это плохо

ответ

5

Каждый раз, когда метод buscarEnCache: называется новый объект кэша создается с помощью строки:

[[cache alloc] init]; 

Таким образом старый кэш просто просочилась и больше не существует.

место cache = [[NSCache alloc] init]; в методе init метода.


Нет необходимости проверять значение countLimit.

-(UIImage *)buscarEnCache:(UsersController *)auxiliarStruct{ 
    UIImage *image = [cache objectForKey:auxiliarStruct.thumb]; 

    if (!image) {  
     NSString *imageURLString = [NSString stringWithFormat:@"http://mydomain.com/%@",auxiliarStruct.thumb]; 
     NSURL *imageURL = [NSURL URLWithString:imageURLString]; 
     NSData * imageData = [NSData dataWithContentsOfURL:imageURL]; 
     image = [UIImage imageWithData:imageData]; 
     [cache setObject:image forKey:auxiliarStruct.thumb]; 
    } 

    return image; 
} 

Вы можете поместить выборку изображения в способе, который работает в другом потоке и вернуть какое-то заполнитель изображения.

+0

Я перемещаю эту строку в viewDidLoad, но результат тот же. –

+0

Извините, что я сделал ошибку в своем ответе, теория все та же, за исключением того, что вы назначаете и запускаете неправильный путь. – rckoenes

+0

это работает, спасибо !!! –

1

Как и ответ, предоставленный @rckoenes, вы не произвольно распределяете экземпляр кэша; он должен быть:

cache = [[NSCache alloc] init]; 

Который должен быть перемещен в ваш метод init.

+0

Я перемещаю эту строку в viewDidLoad, но результат тот же. –

+0

Почему не работает в быстром кэше? –

Смежные вопросы