CoreData原理就是,把实体类模型文件读入内存,然后根据模型文件创建对应的数据库表。让实体类与数据库表映射,类型java里面的hibernate orm框架。
我们讨论下NSManagedObjectContext。
创建NSManagedObjectContext时,可以指定三种模式:
//或者不加参数,默认就是这个 NSConfinementConcurrencyType //绑定到一个后台线程 NSPrivateQueueConcurrencyType //绑定到一个主线程 NSMainQueueConcurrencyType
那么也就是说,context可以在多线程的情况下使用。如果只在一个单一的线程上使用context,进行数据的保存,那么处理大数量的数据时,肯定会很慢。
所以,最好在不同的现场上使用context。
//可以将如下代码,封装到NSManagedObjectContext得一个分类里面去 static NSManagedObjectContext *_foregroudContext; static NSManagedObjectContext *_backgroudContext; + (NSManagedObjectContext *)foregroudContext { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ //1. 创建一个单例主线程context _foregoundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; //2. 默认设置一个版本自动迁移的存储器 id persistentStoreCoordinator = [NSPersistentStoreCoordinator coordinatorUseAutoMigration];//使用一个分类封装的 [_foregoundContext setPersistentStoreCoordinator:persistentStoreCoordinator]; }; return _foregroudContext; } + (NSManagedObjectContext *)backgroudContext { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ //1. 创建一个新的后台线程context id context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType]; //2. 设置为后台线程context [self setBackgroudContext:context]; //3.将_foregroudContext 设置为 子线程context 的parantContext context.parantContext = [self foregroundContext]; }; return _backgroudContext; } //可以创建一个新的后台线程context作为 _backgroudContext + (void)setBackgroudContext:(NSManagedObjectContext *)context { if (context == _backgoundContext) return; _backgoundContext = nil; _backgoundContext = context; } //获取context的统一入口 + (instancetype)managedObjectContext { if ([NSThread isMainThread]) { return [self foregroundContext]; } else { return [self backgroundContext]; } }
总结:
1. NSManagedObjectContext可以将其他的NSManagedObjectContext设置为 父级context
2. 子级context可以访问父级下所有的对象
3. 而且子级 NSManagedObjectContext 的内容变化后,如果执行save方法,会自动的 merge 到父级 NSManagedObjectContext中
4. 这个时候父级也必须再save一次,如果父级没有父级了,那么就会直接向NSPersistentStoreCoordinator中写入,如果有就会接着向再上一层的父级冒泡【防止多余的调用】
时间: 2024-11-08 22:48:45