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

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-08-28 22:25:51

CoreData封装系列一----NSManagedObjectContext多线程的相关文章

多线程系列(4)使用多线程的安全问题

在使用多线程的时候,往往存在一定的公共数据,为了避免多个线程同时操作同一数据,我们需要为线程加锁. 加锁的原理: 每一个引用类型的对象都有一个同步索引块,指示当前使用该对象的线程数,每个线程执行到Lock语句块的时候就会判断当前锁定项(这里是this,当前窗体对象)的同步索引块是否等于0(即没有线程在访问该变量),如果等于0则进入执行块,首先将同步索引块的索引加1,表示当前多了一个线程使用this,等lock块执行完成再将同步索引块中的索引值减1,使得其它线程能够继续访问,这样就相当于实现了一个

带你玩转java多线程系列 “道篇” 多线程的优势及利用util.concurrent包测试单核多核下多线程的效率

java多线程 “道篇” - 多线程的优势及用concurrent包测试单核多核下多线程的效率 1 超哥对于多线程自己的理解 2 测试代码 3 CountDownLatch这个同步辅助类科普 4 如何把电脑设置成单核 5 测试结果 1 超哥对于多线程自己的理解 超哥的理解:对于多线程,无非是对于顺序执行下任务的一种抽取和封装,将原来顺序执行的任务单独拿出来放到线程类的run方法中,通过线程类的start方法进行执行,对于多线程访问共同资源时,我们需要加锁,也就是只有某个线程在拥有锁的时候,才能够

Java总结篇系列:Java多线程(三)

一.一个典型的Java线程安全例子 1 public class ThreadTest { 2 3 public static void main(String[] args) { 4 Account account = new Account("123456", 1000); 5 DrawMoneyRunnable drawMoneyRunnable = new DrawMoneyRunnable(account, 700); 6 Thread myThread1 = new Thr

Java总结篇系列:Java多线程(四)

ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序. ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程”.其实,ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些. 当使用ThreadLocal维护变量时,Thr

MySQL并发复制系列二:多线程复制 2016

并发复制(Parallel Replication) 系列二: Enhanced Multi-threaded Slaves作者:沃趣科技MySQL数据库工程师  麻鹏飞 首先梳理下传统MySQL/MariaDB主备复制基本原理: 主从复制通过三个线程来完成,在master节点运行的binlog dump的线程,I/O线程和SQL线程运行在slave 节点 master节点的Binlog dump线程,当slave节点与master正常连接的时候,master把更新的binlog 内容推送到sl

MySQL并发复制系列二:多线程复制

http://blog.itpub.net/28218939/viewspace-1975822/ 并发复制(Parallel Replication) 系列二: Enhanced Multi-threaded Slaves作者:沃趣科技MySQL数据库工程师  麻鹏飞 首先梳理下传统MySQL/MariaDB主备复制基本原理: 主从复制通过三个线程来完成,在master节点运行的binlog dump的线程,I/O线程和SQL线程运行在slave 节点 master节点的Binlog dump

黑马程序员系列第二篇 多线程(2)

ASP.Net+Android+IOS开发  .Net培训.期待与您交流! (前言:本篇文章主要依据毕向东老师的课程视频整理而成,如要详细学习,请观看毕老师视频  百度网盘链接地址:http://pan.baidu.com/s/1sjQRHDz) 目录:1.线程通信--生产消费者示例(线程通信安全.等待唤醒机制)    2.停止线程.及其会出现的问题.及解决的办法    3.守护线程及几个Thread的方法                   4.工作中线程的常见写法         1.线程通

Java总结篇系列:Java多线程(一)

多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程各重要知识点.掌握了上图中的各知识点,Java中的多线程也就基本上掌握了.主要包括: Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调用线程对象的start()方法(t

高级java必会系列一:多线程的简单使用

众所周知,开启线程2种方法:第一是实现Runable接口,第二继承Thread类.(当然内部类也算...)常用的,这里就不再赘述.本章主要分析总结线程池和常用调度类. 一.线程池 1.newCachedThreadPool (1)缓存型池子,先查看池中有没有以前建立的线程,如果有,就reuse,如果没有,就建立一个新的线程加入池中: (2)缓存型池子,通常用于执行一些生存周期很短的异步型任务:因此一些面向连接的daemon型server中用得不多: (3)能reuse的线程,必须是timeout