CoreData执行流程分析

第一步:将工程中得所有实体类模型文件【Xxx.xcdatamodeld文件】读入内存,并使用一个NSManagedObjectModel单例对象在内存中保存.

//1. 读入工程中所有的实体类模型文件【以单例对象保存】
+ (instancetype)managedObjectModel {
    static NSManagedObjectModel *model = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        //搜索工程中所有的.xcdatamodeld文件,并加载所有的实体到一个NSManagedObjectModel对象中
        model = [NSManagedObjectModel mergedModelFromBundles:@[[NSBundle mainBundle]]];
    });
    return model;
}
//2. 只读入某个名字的模型文件【同样以单例对象保存】

+ (instancetype)managedObjectModelWithName:(NSString *)modelName {
    static NSManagedObjectModel *model = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        /*初始化必须依赖.momd文件路径,而.momd文件由.xcdatamodeld文件编译而来*/
        NSURL *modelURL = [[NSBundle mainBundle] URLForResource:modelName withExtension:@"momd"];
        model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    });

    return model;
}

第二步:利用实体类模型文件的对象NSManagedObjectModel对象,创建NSPersistentStoreCoordinator数据存储区域的单例对象

/**
 *  创建NSPersistentStoreCoordinator对象【单例保存】
 *
 *  @param isAuto    是否使用自动版本迁移
 *  @param storeType 数据文件在手机沙盒目录存放的格式
 *  @param fileURL   数据文件在手机沙盒目录存放的路径
 *
 */
+ (instancetype)createWithAutoMigration:(BOOL)isAuto
                              StoreType:(NSString *)storeType
                           StoreFileURL:(NSURL *)fileURL
{
    //1. 实体类模型文件读入内存对象保存
    NSManagedObjectModel *model = [NSManagedObjectModel managedObjectModel];

    //2. 传入实体类模型文件对象,创建PersistentStoreCoordinator存储区域对象
    NSPersistentStoreCoordinator * coordinator = nil;
    coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

    //3. 指定在手机本地存放数据库的 位置、类型、配置
    NSDictionary *options = isAuto ? [self autoMigrationOptions] : nil;
    NSError *error = nil;
    [coordinator addPersistentStoreWithType:storeType
                              configuration:nil
                                        URL:fileURL
                                    options:options
                                      error:&error];

    if (error) {
        ErrorLog(error);
        abort();
    }

    if (!coordinator) {
        [NSException raise:@"NSPersistentCoordinator Create Failed With URL: %@ , Error Message: %@"
                    format:[fileURL absoluteString], [error localizedDescription]];
    }

    return coordinator;
}

第三步:使用数据存储区域对象NSPersistentCoordinator单例对象,创建NSManagedObjectContext对象,使用这个对象作为操作数据持久化Api的入口

//1. 主线程上得单例Context对象

+ (instancetype)foregroundContext {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _foregoundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
        //默认设置一个版本自动迁移的存储器
        id persistentStoreCoordinator = [NSPersistentStoreCoordinator coordinatorUseAutoMigration];
        [_foregoundContext setPersistentStoreCoordinator:persistentStoreCoordinator];
    });
    return _foregoundContext;
}
//2. 后台子线程上得单例Context对象

+ (instancetype)backgroundContext {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        id context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];
        [self setBackgroudContext:context];
        [_backgoundContext setParentContext:[self foregroundContext]];
    });
    return _backgoundContext;
}
//3. 提供获取单例Context对象的入口函数,对不同线程提供不同的单例Context对象

+ (instancetype)managedObjectContext {
    if ([NSThread isMainThread]) {
        return [self foregroundContext];
    } else {
        return [self backgroundContext];
    }
}

最后,CoreData自动将实体类模型文件、已经实体类之间的关系,在手机沙盒目录Document目录创建数据库表,并设置表之间的关联关系。

时间: 2024-07-29 06:02:28

CoreData执行流程分析的相关文章

转 深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇)

深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇) 最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前九篇中,介绍了mybatis的配置以及使用, 那么本篇将走进mybatis的源码,分析mybatis 的执行流程, 好啦,鄙人不喜欢口水话,还是直接上干活吧: 1. SqlSessionFactory 与 SqlSession. 通过前面的章节对于mybatis 的介绍及使用,大家都能体会到SqlSession的重要性了吧, 没错,从表面上来看,

Hive SQL执行流程分析

转自 http://www.tuicool.com/articles/qyUzQj 最近在研究Impala,还是先回顾下Hive的SQL执行流程吧. Hive有三种用户接口: cli (Command line interface) bin/hive或bin/hive –service cli 命令行方式(默认) hive-server/hive-server2 bin/hive –service hiveserver 或bin/hive –service hiveserver2 通过JDBC/

wget www.baidu.com执行流程分析

通过GDB分析程序的执行流程如下: main.c(main) url_parse:解析url,获取url相关信息,返回结构体 struct url 的指针,存于 url_parsed retrieve_url:主要参数 url_parsed ,下载文件,下载网页的关键函数 retr.c(retrieve_url) http_loop,通过 HTTP 下载指定文件 http.c(http_loop) gethttp, 获取文档 http.c(gethttp) connect_to_host:给定域

ThinkPHP 框架执行流程分析

总体来说,应用的流程涉及到几个文件:Index.phpThinkPHP.phpThink.class.phpApp.class.phpDispatcher.class.phpThinkPHP/Mode/common.phpReadHtmlBehavior.class.phpRoute.class.phpHook.class.phpContentReplaceBehavior.class.phpWriteHtmlCacheBehavior.class.php ThinkPHP框架开发的应用的标准执

深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇)

原文地址:http://www.cnblogs.com/dongying/p/4142476.html 最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前九篇中,介绍了mybatis的配置以及使用, 那么本篇将走进mybatis的源码,分析mybatis 的执行流程, 好啦,鄙人不喜欢口水话,还是直接上干活吧: 1. SqlSessionFactory 与 SqlSession. 通过前面的章节对于mybatis 的介绍及使用,大家都能体会到SqlSession

spark-sql执行流程分析

spark-sql 架构 图1 图1是sparksql的执行架构,主要包括逻辑计划和物理计划几个阶段,下面对流程详细分析. sql执行流程 总体流程 parser:基于antlr框架对 sql解析,生成抽象语法树 变量替换,通过正则表达式找出符合规则的字符串,替换成系统缓存环境的变量 SQLConf中的`spark.sql.variable.substitute`,默认是可用的:参考` SparkSqlParser` parser:将antlr的tree转成spark catalyst的Logi

SpringMVC执行流程分析

SpringMVC执行流程图: 流程分析: 1.客户端发送request请求到DispatcherServlet(前端控制器): 2.DispatcherServlet(前端控制器)收到请求后调用HandlerMapping(处理器映射器): 3.HandlerMapping(处理器映射器)根据请求url找到具体的Handler(处理器),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet(前端控制器): 4.DispatcherServlet(前端控制器)

Java Servlet(十二):Servlet、Listener、Filter之间的执行流程分析

时隔几年后,看到本系列文章讲解的内容缺少了不少内容:周末无事分析了Spring Security是如何被集成到Web Servlet(SpringMVC)时,需要重新理清Filter.Listener.Servlet(SpringMVC#DispatcherServlet)之间的执行顺序,于是就有了本篇文章.这个话题是Web Servlet学习中的一个重点,弄清它们之间的执行流程,有助于理解SpringMVC.Spring Security这些框架是否如何与Web Servlet集成到一起. 原

配置Linux Kernel时make menuconfig执行流程分析

   在编译内核前,一般是根据已有的配置文件(一般在内核根目录下的arch/arm/configs/文件夹下,把该目录下的xxx_defconfig文件拷贝到内核根目录下,并重命名为.config)来进行编译; 或者需要先配置裁剪内核. 假设我们要基于一块ARM芯片的开发板配置裁剪内核时,在内核的根目录下运行:make ARCH=arm menuconfig命令后,会弹出如下配置界面: 当我们在内核的根目录下运行make ARM=arm menuconfig这条命令时,内核根目录下的Makefi