2012-03-29 76 views
0

我的应用程序中只有一个数据库模型模式,所以恕我直言,NSManagedObjectModel和NSPersistentStoreCoordinator对象可能驻留在主应用程序委托类中,以便从应用程序的其他部分访问。但是,我想为我的应用程序的各个部分使用不同的NSManagedObjectContexts对象,因为我将使用多线程。如何有不同的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方法移动到那些需要私人数据处理的类?

回答

2

您总是会在主线程上运行一个主要的托管对象上下文。

如果您正在另一个线程上进行后台处理,则可以在后台线程上创建另一个NSManagedObjectContext,并指向同一个NSPersistentStoreCoordinator。

当您在后台上下文中保存/删除/更新时,会触发您在主线程上侦听的通知,并将更改合并回主环境中。

就我个人而言,我没有App Appate中的任何Core Data对象,因为我不认为它们属于那里。我认为苹果在他们的例子中使用了这个例子来简化这个例子。我通常有一个CoreDataStack对象,可以在需要的地方传递。

您可以查看更高级别的Core Data API,例如Magical Record。我刚刚开始使用它,它非常有用,并删除了许多从Core Data获得的样板代码。它由Marcus Zarra和团队撰写,他显然对Core Data非常了解。

在iOS 5中,通过允许ManagedObjectContexts具有父上下文来改进核心数据。所以在你的情况下,你的背景上下文将是父上下文的子节点,显然它更容易合并回来。尽管如此,我还没有尝试过。

+0

谢谢。你能否解释一下“背景情境是父母情境下的孩子”?这种背景下的亲子关系是什么? AFAIK可以创建上下文作为事务:插入记录,更新或删除它们,然后保存上下文。该事务中的所有更改都已提交,因此修改的数据可从另一个上下文中看到。我为什么要在上下文之间建立父子关系,还是我想念一些东西? – Centurion 2012-03-29 18:21:26

+0

你什么时候开始使用Core Data? iOS 5?如果你只知道iOS 5中的Core Data,那么你已经有了父子关系。在iOS 5之前,在后台环境中执行操作有点复杂:http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/coredata/Articles/cdConcurrency.html#//apple_ref/ DOC/UID/TP40003385-SW1 – bandejapaisa 2012-03-29 18:30:45

1

所以,它的逻辑有独立的情况下我的应用程序的各种 多线程部分,以避免从一个应用程序的一部分到另一个犯不必要的 变化的对象。

有可能有多个上下文,这是一个广泛使用的做法。

是合理的离开persistentStoreCoordinator和 managedObjectModel方法在主应用程序委托(和访问这些 通过应用程序),但移动managedObjectContext方法需要专用的数据处理那些 类?

  • 你可以把它留在应用程序委托,通过[[UIApplication sharedApplication] delegate]访问它。
  • 您可以创建一个单独的包含核心数据堆栈的单独类。
  • 你可以传递一个指向类之间managedObjectContext的指针。
  • 每个viewController可以通过setParentContext:创建它自己的上下文,将它链接到父上下文。

正如你所看到的,这取决于你的项目的复杂性。一般来说,如果您需要进行大量特定的检索并保存,则可能需要将Core Data堆栈粘贴到它自己的类中。对于较小的项目,为什么不把它留在应用程序委托中并通过指针传递上下文。

此外,请查看关于核心数据的2011年WWDC会议。它讨论了一些很酷的新功能。

相关问题