多个NSPersistentStoreCoordinator实例是否可以连接到相同的底层SQLite持久存储?
我读过的关于在multithreading上使用Core Data的一切都谈到了使用多个共享一个NSPersistentStoreCoordinator
NSManagedObjectContext
实例。 这是理解的,我已经使它在一个应用程序中使用核心数据的主线程支持用户界面,并有一个后台获取操作,可能需要一段时间才能运行。
问题在于底层SQLite持久性存储的访问是由NSPersistentStoreCoordinator
序列化的,所以仍然有后台抓取操作阻止UI的情况。
后台获取操作永远不会更新数据,只能从中读取数据。 我可以在连接到相同底层SQLite持久性存储的后台线程上设置完全并行的Core Data堆栈( NSManagedObjectContext
, NSManagedPersistentStoreCoordinator
和NSManagedObjectModel
)吗? 看起来这会给UI线程和后台获取操作之间的完全并发。
我自己的尝试性答案现在是肯定的 。
我通过传递NSPersistentStore
实例来初始化我的后台操作。 在后台线程上,这个存储的属性(包括URL)被用来创build一个全新的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];
然后,我使用这个新创build的NSManagedObjectContext
实例执行后台获取。
一切似乎工作得很好。 尽pipe如此,我还没有接受自己的答案,因为我希望有人提供支持或矛盾的证据给我的发现。