多个 NSPersistentStoreCoordinator 实例可以连接到同一个底层 SQLite 持久存储吗?

Posted

技术标签:

【中文标题】多个 NSPersistentStoreCoordinator 实例可以连接到同一个底层 SQLite 持久存储吗?【英文标题】:Can multiple NSPersistentStoreCoordinator instances be connected to the same underlying SQLite persistent store? 【发布时间】:2011-01-19 22:24:54 【问题描述】:

我读过的关于在多线程上使用 Core Data 的所有内容都在谈论使用多个 NSManagedObjectContext 实例共享一个 NSPersistentStoreCoordinator。这是可以理解的,我已经让它在一个应用程序中工作,该应用程序在主线程上使用 Core Data 以支持 UI,并且有一个可能需要一段时间才能运行的后台获取操作。

问题是对底层SQLite持久化存储的访问是通过NSPersistentStoreCoordinator序列化的,所以还是有UI被后台抓取操作阻塞的情况。

后台获取操作永远不会更新数据,只会从中读取数据。我可以在连接到同一个底层 SQLite 持久存储的后台线程上设置一个完全并行的核心数据堆栈(NSManagedObjectContextNSManagedPersistentStoreCoordinatorNSManagedObjectModel)吗?看起来这会在 UI 线程和后台获取操作之间提供完全的并发性。

【问题讨论】:

【参考方案1】:

我自己对此的初步回答现在是是的

我通过传递NSPersistentStore 实例来初始化我的后台操作。在后台线程上,这个 store 的属性,包括 URL,被用来创建一个全新的 Core Data 堆栈,如下所示:

    //  create managed object model
    NSURL *modelUrl = [[NSBundle bundleForClass:[self class]] URLForResource:@"..." withExtension:@"..."];
    NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelUrl];

    //  create persistent store coordinator
    NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];
    NSError *error = nil;
    [persistentStoreCoordinator addPersistentStoreWithType:[store type]
                                            configuration:[store configurationName]
                                                      URL:[store URL]
                                                   options:[store options]
                                                     error:&error];

    //  create managed object context
    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
    [context setPersistentStoreCoordinator:persistentStoreCoordinator];
    [persistentStoreCoordinator release];
    [managedObjectModel release];

然后我使用这个新创建的NSManagedObjectContext 实例执行后台提取。

一切似乎都很好。不过,我还没有接受我自己的答案,因为我希望有人为我的发现提供支持或矛盾的证据。

【讨论】:

嗨,GB,这对您来说还可以吗?我需要做这样的事情,但我在网上找不到任何答案。 到目前为止,我对这种方法还没有任何问题。 据我了解,SQLite 支持多个并发读取器和单个写入器。然后,每个 NSPersistentStoreCoordinator 都将成为读取器,因此这是完全可能的。 这个模型似乎对我有用,但我还没有看到明确的证据证明它是完全合法的。在我的情况下,后台线程主要读取但有时写入(从网站下载数据后)。

以上是关于多个 NSPersistentStoreCoordinator 实例可以连接到同一个底层 SQLite 持久存储吗?的主要内容,如果未能解决你的问题,请参考以下文章

LaTeX输入单个点横向多个点竖向多个点斜向多个点

多个网格、多个 VBO、多个 VAO、OpenGL 4.1

mysql添加多个字段&删除多个字段

部分之间的多个自定义 TableviewCell 上的多个自定义 UICollectionView

Symfony 2 与多个提供商、多个防火墙和多个主机的安全问题

表示多个组的多个列[重复]