【问题标题】:How to have different NSManagedObjectContexts?如何拥有不同的 NSManagedObjectContexts?
【发布时间】:2012-04-13 02:40:05
【问题描述】:

我的应用程序中只有一个数据库模型架构,因此恕我直言,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 方法移动到那些需要私有数据处理的类?

【问题讨论】:

    标签: objective-c ios core-data


    【解决方案1】:

    您将始终拥有一个在主线程上运行的主托管对象上下文。

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

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

    就我个人而言,我在 App Delegate 中没有任何 Core Data 对象,因为我认为它们不属于那里。我认为 Apple 在他们的示例中使用它是为了示例的简单性。我通常有一个 CoreDataStack 对象,它在我需要的地方传递。

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

    在 iOS 5 中,通过允许 ManagedObjectContexts 具有父上下文来改进核心数据。因此,在您的情况下,您的背景上下文将是父上下文的子上下文,显然合并回来要容易得多。不过我还没有尝试过。

    【讨论】:

    • 谢谢。您能否解释一下“背景上下文将是父上下文的子级”?这种上下文的父子关系是什么? AFAIK 您将上下文创建为事务:插入记录,更新或删除它们,然后保存上下文。该事务中的所有更改都已提交,因此修改后的数据可以从另一个上下文中看到。为什么我要在上下文之间建立父子关系,或者我错过了什么?
    • 你是什么时候开始使用 Core Data 的? iOS 5?如果你只知道 iOS 5 中的 Core Data,那么你已经有了父子关系。在 iOS 5 之前,在后台执行操作会稍微复杂一点:developer.apple.com/library/mac/#documentation/cocoa/conceptual/…
    【解决方案2】:

    因此,为各种不同的上下文对象设置单独的上下文对象是合乎逻辑的 我的应用程序的多线程部分,以避免提交不需要的 从一个应用程序部分更改到另一个应用程序部分。

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

    离开persistentStoreCoordinator 和 主应用程序委托中的 managedObjectModel 方法(并访问它们 通过应用程序),但将 managedObjectContext 方法移动到那些 需要私有数据处理的类?

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

    如您所见,这实际上取决于您项目的复杂性。通常,如果您需要进行大量特定的检索和保存,您可能希望将 Core Data 堆栈放在它自己的类中。对于较小的项目,为什么不将其留在应用程序委托中并通过指针传递上下文。

    另外,请查看有关 Core Data 的 2011 年 WWDC 会议。它谈到了一堆很酷的新功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 2017-12-14
      相关资源
      最近更新 更多