【问题标题】:Sould I keep NSManagedObjectModel in a property for later use?我应该将 NSManagedObjectModel 保留在属性中以供以后使用吗?
【发布时间】: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”这个名字让我觉得这隐藏了一些操作,如果为我的应用程序中的每个请求执行,这些操作可能会导致性能不佳。对吗?

【问题讨论】:

    标签: iphone objective-c core-data iphonecoredatarecipes


    【解决方案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,因为当您实际尝试访问它时,它会被处理并延迟实例化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多