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

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

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

  1. - (IBAction)addIntoDataSource:(id)sender {
  2. //    User* user=(User *)[NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:self.myAppDelegate.managedObjectContext];
  3. //    [user setName:_nameText.text];
  4. //    [user setAge:[NSNumber numberWithInteger:[_ageText.text integerValue]]];
  5. //    [user setSex:_sexText.text];
  6. //
  7. //    Address* address=(Address *)[NSEntityDescription insertNewObjectForEntityForName:@"Address" inManagedObjectContext:self.myAppDelegate.managedObjectContext];
  8. //    [address setIdentify:[NSNumber numberWithInteger:[_identyText.text integerValue]]];
  9. //    [address setHomelocation:@"咸宁"];
  10. //    NSError* error;
  11. //    BOOL isSaveSuccess=[_myAppDelegate.managedObjectContext save:&error];
  12. //    if (!isSaveSuccess) {
  13. //        NSLog(@"Error:%@",error);
  14. //    }else{
  15. //        NSLog(@"Save successful!");
  16. //    }
  17. NSManagedObjectContext* context=[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
  18. //    context.parentContext=_myAppDelegate.managedObjectContext;
  19. [context performBlock:^{
  20. //background thread
  21. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mocDidSaveNotification:) name:NSManagedObjectContextDidSaveNotification object:nil];
  22. User* user=(User *)[NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:self.myAppDelegate.managedObjectContext];
  23. [user setName:_nameText.text];
  24. [user setAge:[NSNumber numberWithInteger:[_ageText.text integerValue]]];
  25. [user setSex:_sexText.text];
  26. NSError* error;
  27. if (![context save:&error]) {
  28. NSLog(@"Error is %@",error);
  29. }
  30. //        //main thread
  31. //        [_myAppDelegate.managedObjectContext performBlock:^{
  32. //            NSError* error;
  33. //            if (![_myAppDelegate.managedObjectContext save:&error]) {
  34. //                NSLog(@"error is %@",error);
  35. //            }
  36. //
  37. //        }];
  38. }];
  39. //    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  40. //
  41. //        dispatch_sync(dispatch_get_main_queue(), ^{
  42. //
  43. //        });
  44. //    });
  45. }

通知中心

  1. -(void)mocDidSaveNotification:(NSNotification *)notification
  2. {
  3. NSManagedObjectContext* saveContext=[notification object];
  4. if (_myAppDelegate.managedObjectContext==saveContext) {
  5. return;
  6. }
  7. if (_myAppDelegate.managedObjectContext.persistentStoreCoordinator!=saveContext.persistentStoreCoordinator) {
  8. return;
  9. }
  10. dispatch_sync(dispatch_get_main_queue(), ^{
  11. [_myAppDelegate.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
  12. });
  13. }

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

//    context.parentContext=_myAppDelegate.managedObjectContext;

//        //main thread

//        [_myAppDelegate.managedObjectContext performBlock:^{

//            NSError* error;

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

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

//            }

//

//        }];

CoreData多线程安全的更多相关文章

  1. 【CoreData】parent-child关系ManagedObjectContext应用

    当我们一开始使用CoreData框架和唯一的MOC进行应用的数据持久化的时候,如果创建项目的时候选择了“使用CoreData”,这会是XCode自动生成的模板代码的样子. 同时,配合NSFetched ...

  2. coreData详解

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

  3. 认识CoreData-多线程

    CoreData使用相关的技术点已经讲差不多了,我所掌握的也就这么多了.... 在本篇文章中主要讲CoreData的多线程,其中会包括并发队列类型.线程安全等技术点.我对多线程的理解可能不是太透彻,文 ...

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

    关于CoreData和SQLite多线程访问时的线程安全问题 数据库读取操作一般都是多线程访问的.在对数据进行读取时,我们要保证其当前状态不能被修改,即读取时加锁,否则就会出现数据错误混乱.IOS中常 ...

  5. 在多线程环境中使用CoreData

    在多线程环境中使用CoreData BY 子非鱼 · 2014 年 10 月 13 日   上回书说道,其实CoreData学起来也没有很复杂,我们其实增删改查都和别的ORM大同小异.但是世界总是很复 ...

  6. 关于CoreData和SQLite多线程访问时的线程安全问题

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

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

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

  8. Coredata中的多线程

    =================== 疑问: 1.coredata是什么?结构 2.如果在简单的demo中,我们可以在主线程中使用coredata.但是如果在真正的大项目中,这样可行么? 3.假设都 ...

  9. 多线程操作Coredata(转)

    第一步:搭建 Core Data 多线程环境这个问题首先要解决的是搭建 Core Data 多线程环境.Core Data 对并发模式的支持非常完备,NSManagedObjectContext 的指 ...

随机推荐

  1. vagrant nginx php开发环境中浏览器访问js文件,文件中出现乱码的解决方法

    当nginx配置 sendfile设置为on时,某些js文件中会出现奇怪的字符: ����������������� 不管怎么刷新,重启服务都无效: 通过google搜索之后发现原来是因为开启send ...

  2. Windows 8.1 应用再出发 (WinJS) - 创建一个简单项目

    前面几篇我们介绍了如何利用 C# + XAML 完成Windows Store App 功能的实现,接下来的几篇我们来看看如何利用 Html + WinJS 来完成这些功能. 本篇我们使用WinJS ...

  3. UVA 11732 strcmp() Anyone? (压缩版字典树)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  4. Attribute和Property

    有时很容易对Attribute和Property混淆,因为中文翻译都是“属性”来解释的.其实这两个表达的不是一个层面的东西. Property属于面向对象理论范畴,在使用面向对象思想编程的时候,常常需 ...

  5. Html5 学习系列(五)Canvas绘图API快速入门(2)

    Canvas绘图API Demos 上一篇文章中,笔者已经给大家演示了怎么快速用Canvas的API绘制一个矩形出来.接下里我会在本文中给各位介绍Canvas的其他API:绘制线条.绘制椭圆.绘制图片 ...

  6. SQL关于日期的查询

    SQL查询某天的记录: datediff(day,[Datetime],'2012-08-03')=0 把Datetime换为你的相应字段: SQL查询今天的记录: datediff(day,[Dat ...

  7. 北大青鸟进入ASP.NET MVC的世界(一)

    今天我们开始ASP.NET  MVC 4.0课程的学习第一讲.我们今天主要关注如下5个问题: 1.理解ASP.NET MVC程序的执行过程 2.会使用ASP.NET中的系统对象 3.会搭建ASP.NE ...

  8. PowerDesigner 15.1 安装步骤详细图解及破解

    准备工作: 下载 PowerDesigner 15.1 的安装文件和破解文件 PowerDesigner 15.1 下载地址:http://pan.baidu.com/share/link?share ...

  9. CSS3与页面布局学习总结

    目录 一.BFC与IFC 1.1.BFC与IFC概要 1.2.如何产生BFC 1.3.BFC的作用与特点 二.定位 2.2.relative 2.3.absolute 2.4.fixed 2.5.z- ...

  10. 利用nodejs模块缓存机制创建“全局变量”

    在<深入浅出nodejs>有这样一段(有部分增减): 1.nodejs引入模块分四个步骤 路径分析 文件定位 编译执行 加入内存 2.核心模块部分在node源代码的编译过程中就编译成了二级 ...