我开始使用Swift中的Core Data,正如我在许多教程中看到的那样,每个人都只在ManagedObjectContext
中使用AppDelegate.swift
。
在我的应用程序中,我想在多个视图中使用ManagedObjectContext
,所以我需要一些共享该对象的机制。
我认为创建一个能够在任何地方管理ManagedObjectContext
的课程是一种很好的方法。
我不确定ManagedObjectContext
和其他核心数据相关对象是否可能用singleton初始化,这是一个好方法吗?或者我最好在每个视图之间转移ManagedObjectContext
(我无法理解为什么会更好)。
您是否对Core数据的使用有一些建议/建议或良好的演示?
答案 0 :(得分:3)
基本上有三种选择:
将上下文从应用程序委托对象传递到初始视图控制器,然后再从源视图控制器传递到目标视图控制器。
由于可以从任何地方访问应用程序委托对象,因此请按照AppDelegate
中的模板建议留下核心数据堆栈,然后只需编写
let appDelegate = NSApplication.sharedApplication().delegate as! AppDelegate
let managedObjectContext = appDelegate.managedObjectContext
将整个Core Data堆栈移动到一个单独的类中,并将其用作singleton
class CoreDataManager: NSObject {
class var sharedManager : CoreDataManager {
struct Singleton {
static let instance = CoreDataManager()
}
return Singleton.instance
}
// MARK: - Core Data stack
lazy var managedObjectModel: NSManagedObjectModel = {
// The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model.
let modelURL = NSBundle.mainBundle().URLForResource("MyModel", withExtension: "momd")!
return NSManagedObjectModel(contentsOfURL: modelURL)!
}()
...
lazy var managedObjectContext: NSManagedObjectContext = {
...
并用
调用它let managedObjectContext = CoreDataManager.sharedManager.managedObjectContext
答案 1 :(得分:3)
StackOverflow上多次提问has been asked。您询问是否应将ManagedObjectContext
从视图传递到视图。 The official answer from Apple is yes:
创建视图控制器时,将它传递给应该使用的上下文。您传递现有上下文,或者(在您希望新控制器管理一组离散编辑的情况下)为您创建的新上下文。应用程序委托通常负责创建一个上下文以传递给显示的第一个视图控制器。
视图控制器通常不应从全局对象(例如应用程序委托)检索上下文 - 这会使应用程序体系结构变得僵硬。视图控制器也不应为自己的用途创建上下文(除非它是嵌套的上下文)。这可能意味着使用控制器上下文执行的操作未在其他上下文中注册,因此不同的视图控制器将对数据有不同的视角。
这称为dependency injection。您是否选择使用它取决于您。依赖于AppDelegate
或创建单独的单身人士来访问managedObjectContext
会使您的代码更加“严格”,正如他们所说的那样,并且可能会导致问题。
话虽这么说,很多人都会使用单身人士来做这类事情。这很容易,成本也不会立即显现出来。除了我在上面发布的搜索“依赖注入”的SO链接之外,还会在这里用几句话来解释其优势。