CoreData中的NSManagedObjectContext在多线程中不安全,如果想要多线程访问CoreData的话,最好的方法是一个线程一个NSManagedObjectContext,

,每个NSManagedObjectContext对象实例都可以使用同一个NSPersistentStoreCoordinator实例,这个实例可以很安全的顺序访问永久存储,这是因为NSManagedObjectContext会在便用NSPersistentStoreCoordinator前上锁。

ios5.0为NSManagedObjectContext提供了initWithConcurrentcyType方法,其中的一个NSPrivateQueueConcurrencyType,会自动的创建一个新线程来存放NSManagedObjectContext而且它还会自动创建NSPersistentStoreCoordinator,AppDelegate和前一章的一样,ios5.0之前的可以用GCD来实现

- (IBAction)addIntoDataSource:(id)sender {
//    User* user=(User *)[NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:self.myAppDelegate.managedObjectContext];
//    [user setName:_nameText.text];
//    [user setAge:[NSNumber numberWithInteger:[_ageText.text integerValue]]];
//    [user setSex:_sexText.text];
//
//    Address* address=(Address *)[NSEntityDescription insertNewObjectForEntityForName:@"Address" inManagedObjectContext:self.myAppDelegate.managedObjectContext];
//    [address setIdentify:[NSNumber numberWithInteger:[_identyText.text integerValue]]];
//    [address setHomelocation:@"咸宁"];
//    NSError* error;
//    BOOL isSaveSuccess=[_myAppDelegate.managedObjectContext save:&error];
//    if (!isSaveSuccess) {
//        NSLog(@"Error:%@",error);
//    }else{
//        NSLog(@"Save successful!");
//    }NSManagedObjectContext* context=[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
//    context.parentContext=_myAppDelegate.managedObjectContext;[context performBlock:^{//background thread[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mocDidSaveNotification:) name:NSManagedObjectContextDidSaveNotification object:nil];User* user=(User *)[NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:self.myAppDelegate.managedObjectContext];[user setName:_nameText.text];[user setAge:[NSNumber numberWithInteger:[_ageText.text integerValue]]];[user setSex:_sexText.text];NSError* error;if (![context save:&error]) {NSLog(@"Error is %@",error);}
//        //main thread
//        [_myAppDelegate.managedObjectContext performBlock:^{
//            NSError* error;
//            if (![_myAppDelegate.managedObjectContext save:&error]) {
//                NSLog(@"error is %@",error);
//            }
//
//        }];}];//    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//
//        dispatch_sync(dispatch_get_main_queue(), ^{
//
//        });
//    });
}

通知中心

-(void)mocDidSaveNotification:(NSNotification *)notification
{NSManagedObjectContext* saveContext=[notification object];if (_myAppDelegate.managedObjectContext==saveContext) {return;}if (_myAppDelegate.managedObjectContext.persistentStoreCoordinator!=saveContext.persistentStoreCoordinator) {return;}dispatch_sync(dispatch_get_main_queue(), ^{[_myAppDelegate.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];});
}

其实也可以不用通知就是把 下面的内容不让其注释,同时注释通知中心就行了

//    context.parentContext=_myAppDelegate.managedObjectContext;

//        //main thread

//        [_myAppDelegate.managedObjectContext performBlock:^{

//            NSError* error;

//            if (![_myAppDelegate.managedObjectContext save:&error]) {

//                NSLog(@"error is %@",error);

//            }

//

//        }];

有什么问题请多多指教

CoreData多线程安全相关推荐

  1. CoreData多线程

    CoreData中的NSManagedObjectContext在多线程中不安全,如果想要多线程访问CoreData的话,最好的方法是一个线程一个NSManagedObjectContext,每个NS ...

  2. coreData详解

    1.初识CoreData CoreData的结构构成: NSManagedObjectModel的构成: 可以通过Entity创建继承自NSManagedObject类的文件,这个文件就是开发中使用的 ...

  3. CoreData和SQLite多线程访问时的线程安全问题

    数据库读取操作一般都是多线程访问的.在对数据进行读取时,我们要保证其当前状态不能被修改,即读取时加锁,否则就会出现数据错误混乱. IOS中常用的两种数据持久化存储方式:CoreData和SQLite, ...

  4. CoreData整理(二)——多线程方案

    CoreData整理(二)--多线程方案 目录 为何使用多线程 如何使用多线程 多线程方案 为何使用多线程 到了这里你一定会问,增删改查功能已经实现了,用的好好的为什么要使用多线程呢?其实想一想,Co ...

  5. iphone开发之数据库CoreData

    CoreData 介绍 在Cocoa环境下,如果你想使用数据库(如sqlite),你可以使用sql语句的方式通过相关的工具类进行数据库的直接操作.当然你也可以通过别人封装之后的一些简单框架,使得你的操 ...

  6. 让CoreData更简单些

    从简书迁移到掘金 前言 本文并不是CoreData从入门到精通之类的教程, 并不会涉及到过多的原理概念描述, 而是介绍如何让CoreData的使用变得更加简单明了, 方便亲民. 全文约六千字, 预计花 ...

  7. iOS之coreData

    简单说明 coreData是苹果提供的数据本地化的解决方案中的一种,实质还是提供数据库去存储数据,只是在coreData中不需要程序员手动创建数据库文件,由coreData自动创建. coreData ...

  8. Core Data 多线程操作实战篇

    最近在解决百度音乐iPhone客户端偶现数据库操作crash的问题,顺手整理了下CoreData的多线程原则,以及实际开发时应该如何遵守这些原则. Core Data多线程操作的基本原则 不允许跨线程 ...

  9. iOS CoreData (一) 增删改查

    代码地址如下: http://www.demodashi.com/demo/11041.html Core Data是iOS5之后才出现的一个框架,本质上是对SQLite的一个封装,它提供了对象-关系 ...

最新文章

  1. 修改Visual Studio 2010帮助位置
  2. PHP输出中文乱码的解决方法
  3. HDU - 1027 全排列
  4. python父进程调用子进程_Python2.7下,调用subprocess启动子进程,读取子进程标准输出若干问题...
  5. C语言中__attribute__ ((at())绝对定位的应用
  6. python:浅析python 中__name__ = '__main__' 的作用(转载)
  7. PyTorch之torch.nn.CrossEntropyLoss()
  8. 重磅推荐,计算机视觉开源周报20191003期
  9. 你怎么看待中国石油上市以来的表现?
  10. 学习 Linux LVM
  11. POJ3274 Gold Balanced Lineup【Hash函数】
  12. concurrenthashmap_ConcurrentHashMap核心原理,这次彻底给整明白了
  13. redis数据类型之set入门
  14. 一步一步学Ruby(五): Class, Module, Object,Kernel的关系
  15. oracle cube语法,oracle Rollup 和 Cube用法
  16. mock.js文档详解5及下载(Random中的Name,Web,Address种类函数)
  17. java技术经理面试题
  18. mysql设置外部ip访问
  19. 用node-webkit接入steamAPI
  20. 吐温20龙沙化工Glycosperse_L-20KFG聚氧乙烯20山梨醇酐单月桂酸酯

热门文章

  1. js中onsubmit用法
  2. C语言Math函数库简介
  3. rap2一键部署 (包括RAP2-DELOS与RAP2-DOLORES)
  4. 日本动漫作家和其部分作品
  5. Github下载C++代码运行出现的问题
  6. 小程序列表多个批量倒计时
  7. 点选式验证码?使用深度学习搞定它
  8. JDBC与JAVA程序笔记
  9. IE浏览器input元素text-overflow: ellipsis
  10. principal java_CAS 单点登录服务端 如何获取到principal