2015-02-06 4 views
1

Я использую NSCache для хранения изображений. Но проблема здесь - это когда я переключаюсь между контроллерами, NSCache пуст. Я хочу, чтобы элементы были там, по крайней мере, до тех пор, пока приложение не будет закрыто или пользователь не выйдет из системы. Допустим, у меня есть представление в виде вкладок, и я сохраняю изображения из данных на первой вкладке. Когда я перейду ко второй вкладке и вернусь к первому, NSCache снова инициализируется.Инициализация NSCache для хранения UIImage ios

Вот мой код: -

- (void)viewDidLoad { 
[super viewDidLoad]; 
if(imageCache==nil) 
{ 
    imageCache=[[NSCache alloc]init]; 
    NSLog(@"initialising"); 
} 
[imageCache setEvictsObjectsWithDiscardedContent:NO]; 
} 


(void) reloadMessages { 

[Data getClassMessagesWithClassCode:_classObject.code successBlock:^(id object) { 
    NSMutableArray *messagesArr = [[NSMutableArray alloc] init]; 
    for (PFObject *groupObject in object) { 

     PFFile *file=[groupObject objectForKey:@"attachment"]; 
     NSString *url1=file.url; 
     NSLog(@"%@ is url to the image",url1); 
     UIImage *image = [imageCache objectForKey:url1]; 
     if(image) 
     { 
      NSLog(@"This is cached"); 

     } 
     else{ 

      NSURL *imageURL = [NSURL URLWithString:url1]; 
      UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:imageURL]]; 

      if(image) 
      { 
       NSLog(@"Caching ...."); 
       [imageCache setObject:image forKey:url1]; 
      } 

     } 

    } 

Контроль никогда не идет в первый, если заявление. Я что-то упускаю?

ответ

9
@interface Sample : NSObject 

+ (Sample*)sharedInstance; 

// set 
- (void)cacheImage:(UIImage*)image forKey:(NSString*)key; 
// get 
- (UIImage*)getCachedImageForKey:(NSString*)key; 

@end 

#import "Sample.h" 

static Sample *sharedInstance; 

@interface Sample() 
@property (nonatomic, strong) NSCache *imageCache; 
@end 

@implementation Sample 

+ (Sample*)sharedInstance { 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedInstance = [[Sample alloc] init]; 
    }); 
    return sharedInstance; 
} 
- (instancetype)init { 
    self = [super init]; 
    if (self) { 
     self.imageCache = [[NSCache alloc] init]; 
    } 
    return self; 
} 

- (void)cacheImage:(UIImage*)image forKey:(NSString*)key { 
    [self.imageCache setObject:image forKey:key]; 
} 

- (UIImage*)getCachedImageForKey:(NSString*)key { 
    return [self.imageCache objectForKey:key]; 
} 

В коде:

UIImage *image = [[Sample sharedInstance] getCachedImageForKey:url1]; 
    if(image) 
    { 
     NSLog(@"This is cached"); 

    } 
    else{ 

     NSURL *imageURL = [NSURL URLWithString:url1]; 
     UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:imageURL]]; 

     if(image) 
     { 
      NSLog(@"Caching ...."); 
      [[Sample sharedInstance] cacheImage:image forKey:url1]; 
     } 

    } 
  1. Если приложение проходит в фоновом режиме NSCache воли чистит.

  2. Вы всегда создаете новый кеш, лучший способ - использовать sharedInstance только с одним объектом NSCache.

+0

Да, это дает мне то, что я намеревался сделать. Но часто места, которые я читал, что общие экземпляры не являются хорошей практикой. Каждый класс должен иметь свой собственный NSCache. А что касается общего экземпляра, это нормально, если я использую его для всех просмотров? – user2714823

+0

Возможно, это решение не идеально, но легко для меня. Я могу получить кешированные изображения с любого контроллера вида. Кроме того, я сохраняю загруженные изображения в каталог документов. 1. получить изображение в кеше, если нет. => 2. получить изображение в документах dir, if not present => 3. загрузить из Интернета => 4. сохранить в dir => 5. положить в кеш – iOSfleer

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