缓存NSManagedObject实例是一个坏主意吗?

时间:2013-12-31 00:16:14

标签: caching core-data ios7 nsmanagedobject

我有一个名为Product的核心数据实体,最初在用户首次登录应用程序时填充。如果用户请求刷新,则可以再次加载它。

在应用中的多个位置查询Product实体。所以,我决定实现一个可以在应用程序中共享的简单缓存。缓存保留产品NSManagedObjects 在地图上。这是一个坏主意吗?

ProductCache类:

@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

2 个答案:

答案 0 :(得分:7)

我个人不会像这样缓存Core Data对象。核心数据是您的缓存。当你也考虑到线程问题(NSManagedObject实例不能越过线程边界)时,将内存缓存放在Core Data之上会变得更加危险。这甚至不考虑内存问题,在所有条件相同的情况下,您的缓存不会像Apple的缓存(即核心数据)那样运行。

如果您需要对Core Data对象进行即时访问(相对于磁盘上的纳秒访问),请考虑将磁盘缓存复制到内存缓存中,然后再访问它。但是,如果纳秒访问时间足够,请将其保留在Core Data中,并在需要时获取实体。如果你发现它是重复的,那么为fetch构建方便的方法,但是不要把缓存放在最上面。

答案 1 :(得分:0)

我想说这是不必要的,但我想这实际上取决于几个因素。

  • Products对象有多大?
  • 查询/重新查询是否极其耗费CPU?
  • 主线程是否被阻止?

就我个人而言,我认为您可以避免缓存,只需在后台线程上重新查询Products对象即可。

更好的问题是:是否值得为项目的这个特定方面使用Core Data?

为什么不将字典存储在NSUserDefaults中(如果你的字母很小)?