CoreData封装系列一----NSManagedObjectContext多线程
2015-07-07 11:38
447 查看
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设置为 父级context2. 子级context可以访问父级下所有的对象
3. 而且子级 NSManagedObjectContext 的内容变化后,如果执行save方法,会自动的 merge 到父级 NSManagedObjectContext中
4. 这个时候父级也必须再save一次,如果父级没有父级了,那么就会直接向NSPersistentStoreCoordinator中写入,如果有就会接着向再上一层的父级冒泡【防止多余的调用】
相关文章推荐
- Objectness 使用小结
- Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法
- Objective-C 初始化
- Objective-C Runtime中的并发内存分配
- Objective-C Runtime中的并发内存分配
- [Objective-C] 哪些变量默认初始化为0
- DbContext 和ObjectContext两者的区别
- 深入理解Objective-C的Runtime机制
- [Objective-C] assign/retain/copy 详解
- [Objective-C] 属性中的 atomic/nonatomic/assign/retain/copy/readwrite/readonly 详解
- [Objective-C] @property是不能被“预处理”的,而是直接编译成汇编指令
- Object-Oriented Terms 面向对象术语
- Objective-C 中的 Meta-class 是什么
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第十一章 分类和协议
- 运行时runbime
- iOS_Objective-C_控件中的字体加粗
- ./show_file: error while loading shared libraries: libts-0.0.so.0: cannot open shared object file: N
- [Objective-C] 012_数据持久化_XML属性列表,NSUserDefaults
- IOS 关于objc_setAssociatedObject,objc_getAssociatedObject
- object-c的异常处理机制