我读过的关于在多个线程上使用Core Data的所有内容都讨论了使用共享单个NSPersistentStoreCoordinator的多个NSManagedObjectContext实例.这是理解的,我已经使它在一个应用程序中工作,该应用程序在主线程上使用Core Data来支持UI,并且具有可能需要一段时间才能运行的后台获取操作.
问题是NSPersistentStoreCoordinator会对基础sqlite持久性存储的访问进行序列化,因此仍然存在背景提取操作阻止UI的情况.
后台提取操作永远不会更新数据,只能从中读取数据.我可以在连接到相同底层sqlite持久性存储的后台线程上设置完全并行的Core Data堆栈(NSManagedObjectContext,NSManagedPersistentStoreCoordinator和NSManagedObjectModel)吗?看起来这样可以在UI线程和后台获取操作之间提供完全的并发性.
解决方法
我现在的尝试性答案现在是肯定的.
我通过传递NSPersistentStore实例初始化我的后台操作.在后台线程中,此存储的属性(包括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];