用于存储 UIImage ios 的 NSCache 初始化

Posted

技术标签:

【中文标题】用于存储 UIImage ios 的 NSCache 初始化【英文标题】:NSCache initialization for storing UIImage ios 【发布时间】:2015-02-06 13:00:22 【问题描述】:

我正在使用 NSCache 来存储图像。但是这里的问题是,一旦我在控制器之间切换,NSCache 就会清空。我希望这些项目至少在应用程序关闭或用户注销之前一直存在。 假设我有一个选项卡视图,并且我将数据中的图像存储在第一个选项卡中。当我转到第二个选项卡并切换回第一个选项卡时,NSCache 再次初始化。

这是我的代码:-

- (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];
            

        

    

控制永远不会转到第一个 if 语句。我错过了什么吗?

【问题讨论】:

【参考方案1】:
@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];
        

    

    如果 App 进入后台,NSCache 将被清理。

    你总是创建一个新的缓存,更好的方法是使用 sharedInstance 和一个 NSCache 对象。

【讨论】:

是的,这给了我我想要做的事情。但我经常读到的地方共享实例不是好的做法。每个类都应该有自己的 NSCache。至于共享实例,我把它用于所有视图可以吗? 也许这个解决方案并不完美,但对我来说很容易。我可以从任何视图控制器获取缓存的图像。此外,我将下载的图像保存到文档目录。 1. 在缓存中获取图像,如果不存在 => 2. 在文档目录中获取图像,如果不存在 => 3. 从互联网下载 => 4. 保存到目录 => 5. 放入缓存

以上是关于用于存储 UIImage ios 的 NSCache 初始化的主要内容,如果未能解决你的问题,请参考以下文章

iOS NSMutableDictionary中UIImage的存储和读取

UIImage的线程安全

如何以降序对ios中添加的UIImage添加NSMutableArray进行排序

用于 OCR 的 iOS UIImage 二值化 - 处理具有不同亮度的图像

iOS - 将 UIImage 转换为 vImage 内存处理

如何在ios中从UIImage设置图像