如何有不同的NSManagedObjectContexts?
我的应用程序中只有一个数据库模型模式,因此恕我直言,NSManagedObjectModel和NSPersistentStoreCoordinator对象可能驻留在主应用程序委托类中,以便从应用程序的其他部分访问。 但是,我想为我的应用程序的各个部分使用不同的NSManagedObjectContexts对象,因为我将使用多线程。
从我个人的数据库经验来看,我认为NSManagedObjectContext在某种程度上与数据库事务的概念相似。 因此,为了避免将不需要的更改从一个应用程序部分提交到另一个应用程序部分,我的应用程序的各个多线程部分具有单独的上下文对象是合乎逻辑的。 在创建启用核心数据的新项目时,Xcode在主应用程序委托中创建三个基本方法
- (NSManagedObjectModel *)managedObjectModel{
// reads your database model file and defined entities from defined DataSchema.xcdatamodeld file
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator{
// uses already read database model and initializes defined sqlite database file and returns a persistent store coordinator - a pointer to the database
}
- (NSManagedObjectContext *)managedObjectContext{
// opens a connection (and transaction) to the database.
}
所以,问题是,在主应用程序委托中保留persistentStoreCoordinator和managedObjectModel方法并通过应用程序访问它们是合理的,但要将managedObjectContext方法移动到需要私人数据处理的类中?
您总是会在主线程上运行一个主要的托管对象上下文。
如果您正在另一个线程上进行后台处理,则可以在后台线程上创建另一个NSManagedObjectContext,并指向相同的NSPersistentStoreCoordinator。
当您在后台上下文中保存/删除/更新时,会触发您在主线程中侦听的通知,并将更改合并回主环境中。
就我个人而言,我没有App Appate中的任何Core Data对象,因为我不认为它们属于那里。 我认为苹果在他们的例子中使用了这个例子来简化这个例子。 我通常有一个CoreDataStack对象,可以在需要的地方传递。
您可以查看更高级别的Core Data API,例如Magical Record。 我刚刚开始使用它,它非常有用,并删除了许多从Core Data获得的样板代码。 它由Marcus Zarra和团队撰写,他显然对Core Data非常了解。
在iOS 5中,Core数据通过允许ManagedObjectContexts具有父上下文而得到了改进。 所以在你的情况下,你的背景上下文将是父上下文的子节点,显然它更容易合并回来。尽管如此,我还没有尝试过。
因此,为了避免将不需要的更改从一个应用程序部分提交到另一个应用程序部分,我的应用程序的各个多线程部分具有单独的上下文对象是合乎逻辑的。
有可能有多个上下文,这是一个广泛使用的做法。
在主应用程序委托中保留persistentStoreCoordinator和managedObjectModel方法(并通过应用程序访问它们)是合理的,但要将managedObjectContext方法移动到需要私人数据处理的类中?
[[UIApplication sharedApplication] delegate]
访问它。 setParentContext:
将它链接到父上下文setParentContext:
。 正如你所看到的,这取决于你项目的复杂性。 一般来说,如果您需要进行大量特定的检索并保存,则可能需要将Core Data堆栈粘贴到它自己的类中。 对于较小的项目,为什么不把它留在应用程序委托中并通过指针传递上下文。
另外,请查看2011年WWDC关于核心数据的会议。 它讨论了一些很酷的新功能。
链接地址: http://www.djcxy.com/p/91655.html