IOS/xcode:将核心数据从应用委托移动到模型类

Posted

技术标签:

【中文标题】IOS/xcode:将核心数据从应用委托移动到模型类【英文标题】:IOS/xcode: move core data from app delegate to model class 【发布时间】:2015-02-04 03:11:30 【问题描述】:

ios 新手在核心数据上苦苦挣扎。 Xcode 示例项目将核心数据放在应用程序委托中。然后在应用程序的 delegate.m 文件中,在 application didFinishLaunchingWithOptions: 方法中包含对核心数据文件的调用:controller.managedObjectContext = self.managedObjectContext;,它会在主控制器中启动 managedobjectcontext。

然而,我已经读到,应用程序委托文件实际上并不是您应该放置核心数据内容的位置,而是应该将其放在模型文件中并将其作为单例调用。

我的问题是,如果您将其从应用程序委托文件中移出到没有 application didFinishLaunchingWithOptions: 方法的文件中,您如何确保托管对象上下文在您需要的地方可用,即在其他视图控制器中?换句话说,如果所有核心数据都在模型文件中,那么从控制器文件中调用它的正确语法是什么,或者从模型文件中使其可用于控制器文件。

这个问题已经让我发疯了两个星期,所以非常感谢任何建议。

【问题讨论】:

【参考方案1】:

请参考这个例子:http://www.objc.io/issue-10/networked-core-data-application.html

github 上有源代码链接,它显示了将 coreData 代码从 AppDelegate 移动到单独的模型类 PersistentStack 的一种方法。在示例中,AppDelegate 仍然通过 PersistentStack 实例间接维护对托管对象上下文的引用。

根据模块化的需要,还有许多其他方法可以将 coredata 代码分离到单独的类中。

【讨论】:

我看过本教程,毫无疑问,它与我尝试过的其他教程类似,但我正在努力理解一般原则。您能否建议代码以使托管对象上下文等可用于视图控制器。我是否将代码放在模型类或视图中加载或视图控制器中的类似生命周期方法?在应用程序委托版本中,代码在应用程序委托应用程序中完成启动,即与核心数据堆栈相同的文件,但如果将其放在子类 nsobject 的模型文件中,则没有生命周期方法。救命!!! 对不起,我误解了您的担忧。没有真正需要从 AppDelegate 的 applicationDidFinishLaunching 获取 managedObjectContext 到单个模型对象。我还没有看到这样做。我已经看到了为另一个类创建 managedObjectContext 的实际代码,如上面的示例。通常,您只为整个应用程序使用一个 managedObjectContext,在 AppDelegate 中设置它,然后通过使用 managedObjectContext 在 vi​​ewController 上设置一个属性将其传递给其他 viewController。如果确实需要,可以覆盖模型对象的 init 方法 这是 applicationDidFinishLaunching 中的代码吗: UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController; IDTVC *控制器 = (IDTVC *)navigationController.topViewController; controller.managedObjectContext = self.managedObjectContext;尽管我包含了模型,但最后一行抛出错误。 是的,这是将 managedObjectContext 分配给 ViewController 的代码。你能说出错误是什么吗?

以上是关于IOS/xcode:将核心数据从应用委托移动到模型类的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:将对象从一个持久存储移动到另一个

iOS Xcode 从 Maya 导入 COLLADA .dae 3D 模型,同时尊重枢轴点

核心数据版本控制和迁移

通过迁移将核心数据实体及其数据移动到新的核心数据模型文件中

iPhone:在应用程序的未来版本中更新核心数据模型

iOS9 Xcode 7 - 核心数据 - 避免重复对象