objective-c - 如何拥有不同的 NSManagedObjectContext?

标签 objective-c ios core-data

我的应用程序中只有一个数据库模型架构,因此恕我直言,NSManagedObjectModel 和 NSPersistentStoreCoordinator 对象可能位于主应用程序委托(delegate)类中,以便从应用程序的其他部分进行访问。但是,我想为我的应用程序的各个部分使用不同的 NSManagedObjectContexts 对象,因为我将使用多线程。

根据我个人的数据库经验,我认为 NSManagedObjectContext 在某种程度上类似于数据库事务的概念。因此,为我的应用程序的各个多线程部分设置单独的上下文对象是合乎逻辑的,以避免将不需要的更改从一个应用程序部分提交到另一个应用程序部分。当创建启用核心数据的新项目时,Xcode 在主应用程序委托(delegate)中创建三个基本方法

- (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 方法保留在主应用程序委托(delegate)中(并通过应用程序访问它们),但将 managedObjectContext 方法移动到那些需要私有(private)数据处理的类是否合理?

最佳答案

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

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

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

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

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

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

关于objective-c - 如何拥有不同的 NSManagedObjectContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9925568/

相关文章:

c - 了解字节顺序和函数,如 CFSwapInt32HostToBig

ios - NSMutableArray 丢失添加的数据

ios - 视频JS : not working on ipad

ios - 如何在 IOS 中使用解析进行 PFRelation 或关系数据库查询

iphone - 核心数据中带有嵌套对象数组的 Restkit 复杂对象映射

objective-c - NSPasteboard generalPasteboard 返回 nil

iphone - Xcode:在最终的 iOS 应用程序中隐藏/保护资源文件?

ios - 通过 TableView 编辑核心数据

objective-c - 是否有类似于 isUpdated 的方法,如果 NSManagedObject 的关系已更新,它会通知我?

swift - CoreData 编辑行