码迷,mamicode.com
首页 > 编程语言 > 详细

CoreData封装系列一----NSManagedObjectContext多线程

时间:2015-07-07 12:45:06      阅读:258      评论:0      收藏:0      [点我收藏+]

标签:

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中写入,如果有就会接着向再上一层的父级冒泡【防止多余的调用】

 

CoreData封装系列一----NSManagedObjectContext多线程

标签:

原文地址:http://www.cnblogs.com/xiongzenghui/p/4626497.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!