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. Windows 2008安装SQL 2008图解

    SQL Server 2008是一个重大的产品版本,它推出了许多新的特性和关键的改进,使得它成为至今为止的最强大和最全面的SQL Server版本. 在现今数据的世界里,公司要获得成功和不断发展,他们 ...

  2. 王爽-汇编语言-综合研究一-搭建简易C环境

    (一) 学习过程: 整个过程分为两个部分: 第一:将TC2.0的环境使用虚拟软盘复制到DOS虚拟机中: 打开WinImage,fileànew,由于TC2.0的环境解压后为2.02M,所以我们在Sta ...

  3. ubuntu工具积累

    1.sudo apt-get install terminator一款可以切分终端窗口的工具 a.在系统>键盘>快捷键修该ctrl+alt+t快捷应用为terminator,其他的快捷键同 ...

  4. asp控件Repeater运用

    双层repeater嵌套 <asp:Repeater ID="rpt_dataRepeatgroup" runat="server" OnItemData ...

  5. ORM框架 EF - code first 的封装

    Code first 是Microsoft Entity Framework中的一种模式,CodeFirst不会有可视化的界面来进行拖动编辑DataBase-Entity,但会以一个类来进行对数据表关 ...

  6. 如何制作u盘启动盘

    1,下载windows系统            许多人下载windows时会出现各种版本,我推荐在这里下载 你用上面的地址进行下载,一般用迅雷吧.下载结束你就有了镜像文件了. 2,下载安装碟软通 那 ...

  7. 5.4-5.8webstorm css

    关于使用css3 动画完成牛顿摆球效果: 使用的规则为@keyframes,不过目前的浏览器都不支持该规则. Firefox 支持替代的 @-moz-keyframes 规则. Opera 支持替代的 ...

  8. 【转】require.js学习笔记(二)

    require.js遵循AMD规范,通过define定义模块,require异步加载模块,一个js文件即一个模块. 一.模块加载require1.加载符合AMD规范模块 HTML: <scrip ...

  9. 7.1 Java中的堆和栈

    栈与堆都是Java用来在Ram中存放数据的地方.Java自动管理栈和堆,程序员不能直接地设置栈或堆. Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new.newarray.ane ...

  10. php笔试题(3)--转载

    1.nginx使用哪种网络协议? nginx是应用层 我觉得从下往上的话 传输层用的是tcp/ip 应用层用的是http fastcgi负责调度进程 2. <? echo 'hello tush ...