我应该将 NSManagedObjectModel 保留在属性中以供以后使用吗?

Posted

技术标签:

【中文标题】我应该将 NSManagedObjectModel 保留在属性中以供以后使用吗?【英文标题】:Sould I keep NSManagedObjectModel in a property for later use? 【发布时间】:2012-01-30 09:07:22 【问题描述】:

由于我在 model.xcdatamodeld 中嵌入了获取请求,因此我需要一个 NSManagedObjectModel 实例来从中获取获取请求。所以我可以这样做:

NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
NSFetchRequest *fetchRequest = [managedObjectModel fetchRequestFromTemplateWithName:requestTemplateName
                  substitutionVariables:substitutionDictionary];

我的问题是关于 managedObjectModel。我应该把它放在一个财产中重复使用吗?或者我应该在需要时调用 mergeModelFromBundles 吗?

我不知道在内存/速度方面调用“[NSManagedObjectModel mergeModelFromBundles:nil]”的成本。 “mergeModelFrom”这个名字让我觉得这隐藏了一些操作,如果为我的应用程序中的每个请求执行,这些操作可能会导致性能不佳。对吗?

【问题讨论】:

【参考方案1】:

Apple 模板可以做到这一点

- (NSManagedObjectModel *)managedObjectModel

    if (__managedObjectModel != nil) 
        return __managedObjectModel;
    
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"DiscussIt" withExtension:@"momd"];
    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return __managedObjectModel;

这种方式只有在managedObjectModel == nil 时才会完成创建,这就是你想要的。

请注意,这是写在 getter 中的,因此您不必担心要记住实例化 managedObjectModel,因为当您实际尝试访问它时,它会被处理并延迟实例化。

【讨论】:

以上是关于我应该将 NSManagedObjectModel 保留在属性中以供以后使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

NSManagedObjectModel 合并模型FromBundles 错误

RestKit 2.0 删除 RKManagedObjectStore 但保留 NSManagedObjectModel

任何模型中都没有 NSEntityDescriptions 声明 NSManagedObject 子类 你加载你的 NSManagedObjectModel 了吗?

+entityForName: 找不到实体名称的 NSManagedObjectModel

尝试使用前向类“NSManagedObjectModel”作为 Swift 类模型的超类

“无法加载 NSManagedObjectModel。nil 是非法的 URL 参数”