用于存储 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的存储和读取
如何以降序对ios中添加的UIImage添加NSMutableArray进行排序
用于 OCR 的 iOS UIImage 二值化 - 处理具有不同亮度的图像