您的位置:首页 > 移动开发 > Objective-C

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设置为 父级context

2. 子级context可以访问父级下所有的对象

3. 而且子级 NSManagedObjectContext 的内容变化后,如果执行save方法,会自动的 merge 到父级 NSManagedObjectContext中

4. 这个时候父级也必须再save一次,如果父级没有父级了,那么就会直接向NSPersistentStoreCoordinator中写入,如果有就会接着向再上一层的父级冒泡【防止多余的调用】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: