我读到的关于在多线程上使用 Core Data 的所有内容都谈到了使用多个 NSManagedObjectContext
实例共享一个 NSPersistentStoreCoordinator
。这是可以理解的,我已经让它在一个应用程序中工作,该应用程序在主线程上使用 Core Data 来支持 UI,并且具有可能需要一段时间才能运行的后台获取操作。
问题在于,对底层 SQLite 持久存储的访问是由 NSPersistentStoreCoordinator
序列化的,因此仍然存在 UI 被后台获取操作阻塞的情况。
后台获取操作永远不会更新数据,只会从中读取。我可以在连接到同一底层 SQLite 持久性的后台线程上设置完全并行的核心数据堆栈(NSManagedObjectContext
、NSManagedPersistentStoreCoordinator
和 NSManagedObjectModel
)吗店铺?看起来这会在 UI 线程和后台获取操作之间提供完全并发。
最佳答案
我自己对此的初步回答是是。
我通过将 NSPersistentStore
实例传递给它来初始化我的后台操作。在后台线程上,这个商店的属性,包括 URL,被用来创建一个全新的核心数据堆栈,如下所示:
// 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
实例执行后台获取。
似乎一切正常。不过,我还没有接受我自己的回答,因为我希望有人能为我的发现提供支持或反驳的证据。
关于ios - 多个 NSPersistentStoreCoordinator 实例可以连接到同一个底层 SQLite 持久存储吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4741513/