Caching 缓存NSManagedObject实例是个坏主意吗?
我有一个名为Product的核心数据实体,它最初是在用户首次登录应用程序时填充的。如果用户请求刷新,则可以再次加载它 在应用程序中的多个位置查询产品实体。因此,我决定实现一个可以在整个应用程序中共享的简单缓存。缓存保存产品NSManagedObjects 在地图上。这是个坏主意吗 ProductCache类:Caching 缓存NSManagedObject实例是个坏主意吗?,caching,core-data,ios7,nsmanagedobject,Caching,Core Data,Ios7,Nsmanagedobject,我有一个名为Product的核心数据实体,它最初是在用户首次登录应用程序时填充的。如果用户请求刷新,则可以再次加载它 在应用程序中的多个位置查询产品实体。因此,我决定实现一个可以在整个应用程序中共享的简单缓存。缓存保存产品NSManagedObjects 在地图上。这是个坏主意吗 ProductCache类: 我想说这是没有必要的,但我想这确实取决于几个因素 产品对象有多大 查询/重新查询是否占用大量CPU 你的主线程被阻塞了吗 就个人而言,我认为您可以避免缓存,只要在需要时在后台线程上重新
我想说这是没有必要的,但我想这确实取决于几个因素
- 产品对象有多大
- 查询/重新查询是否占用大量CPU
- 你的主线程被阻塞了吗
为什么不将字典存储在NSUserDefaults中(如果您的字典很小)?我个人不会像这样缓存核心数据对象。核心数据是您的缓存。如果还考虑到线程问题(
NSManagedObject
实例无法跨越线程边界),那么在核心数据之上放置内存缓存的风险就更大了。这甚至没有考虑内存问题,因为在所有条件相同的情况下,您的缓存的性能将不如苹果的缓存(即核心数据)
如果需要对核心数据对象进行即时访问(相对于磁盘上的纳秒访问),那么考虑将磁盘上的缓存复制到内存缓存中,然后访问它。但是,如果纳秒访问时间足够,请将其保留在核心数据中,并在需要时获取实体。如果您发现提取重复,请为其构建方便的方法,但不要在顶部放置缓存。
可能有数百种产品。它们最初是通过查询后端webapp加载的。产品对象有29个属性。我认为将它们保存在核心数据中并在需要时从那里而不是服务器加载它们是有意义的。NSUserDefaults看起来更像是一个用户偏好解决方案,而不是用于数据存储。感谢您的推断。绝对使用核心数据!NSUserDefaults无疑是面向用户偏好的,但它也可以扩展到存储小散列。我仍然建议使用后台线程来获取数据,尤其是当对象如此大时。@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