Inicialización NSCache para almacenar UIImage Uios
objective-c (1)
Estoy usando NSCache para almacenar imágenes. Pero el problema aquí es que una vez que cambio de controlador, NSCache se vacía. Quiero que los elementos estén allí al menos hasta que se cierre la aplicación o el usuario cierre la sesión. Digamos que tengo una vista de pestaña y estoy almacenando imágenes de los datos en la primera pestaña. Cuando voy a la segunda pestaña y vuelvo a la primera, NSCache se inicializa de nuevo.
Aquí está mi código:
- (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];
}
}
}
El control nunca va a la primera instrucción if. ¿Me estoy perdiendo de algo?
@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];
}
En tu código:
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];
}
}
Si la aplicación entra en segundo plano, NSCache se limpiará.
Siempre crea un nuevo caché, mejor forma es usar sharedInstance con solo un objeto NSCache.