我有一个名为Product的核心数据实体,最初在用户首次登录应用程序时填充。如果用户请求刷新,则可以再次加载它。
在应用中的多个位置查询Product实体。所以,我决定实现一个可以在应用程序中共享的简单缓存。缓存保留产品NSManagedObjects 在地图上。这是一个坏主意吗?
@interface ProductCache ()
@end
@implementation ProductCache {
}
static NSDictionary *productsDictionary = nil;
static ProductCache *sharedInstance;
+ (ProductCache *)sharedInstance {
@synchronized (self) {
if (sharedInstance == nil) {
sharedInstance = [[self alloc] init];
[sharedInstance reload];
}
}
return sharedInstance;
}
- (void) reload{
NSMutableDictionary *productsMap = [[NSMutableDictionary alloc] init];
CIAppDelegate *delegate = (CIAppDelegate *) [UIApplication sharedApplication].delegate;
NSManagedObjectContext *managedObjectContext = delegate.managedObjectContext;
NSArray *allProducts = [CoreDataManager getProducts:managedObjectContext];
for (Product *product in allProducts) {
[productsMap setObject:product forKey:product.productId];
}
productsDictionary = productsMap;
}
- (NSArray *)allProducts{
return [productsDictionary allValues];
}
- (Product *) productForId:(NSNumber *)productId {
return productId ? [productsDictionary objectForKey:productId] : nil;
}
@end
答案 0 :(得分:7)
我个人不会像这样缓存Core Data对象。核心数据是您的缓存。当你也考虑到线程问题(NSManagedObject
实例不能越过线程边界)时,将内存缓存放在Core Data之上会变得更加危险。这甚至不考虑内存问题,在所有条件相同的情况下,您的缓存不会像Apple的缓存(即核心数据)那样运行。
如果您需要对Core Data对象进行即时访问(相对于磁盘上的纳秒访问),请考虑将磁盘缓存复制到内存缓存中,然后再访问它。但是,如果纳秒访问时间足够,请将其保留在Core Data中,并在需要时获取实体。如果你发现它是重复的,那么为fetch构建方便的方法,但是不要把缓存放在最上面。
答案 1 :(得分:0)
我想说这是不必要的,但我想这实际上取决于几个因素。
就我个人而言,我认为您可以避免缓存,只需在后台线程上重新查询Products对象即可。
更好的问题是:是否值得为项目的这个特定方面使用Core Data?
为什么不将字典存储在NSUserDefaults中(如果你的字母很小)?