CoreData多线程安全
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多线程安全相关推荐
- CoreData多线程
CoreData中的NSManagedObjectContext在多线程中不安全,如果想要多线程访问CoreData的话,最好的方法是一个线程一个NSManagedObjectContext,每个NS ...
- coreData详解
1.初识CoreData CoreData的结构构成: NSManagedObjectModel的构成: 可以通过Entity创建继承自NSManagedObject类的文件,这个文件就是开发中使用的 ...
- CoreData和SQLite多线程访问时的线程安全问题
数据库读取操作一般都是多线程访问的.在对数据进行读取时,我们要保证其当前状态不能被修改,即读取时加锁,否则就会出现数据错误混乱. IOS中常用的两种数据持久化存储方式:CoreData和SQLite, ...
- CoreData整理(二)——多线程方案
CoreData整理(二)--多线程方案 目录 为何使用多线程 如何使用多线程 多线程方案 为何使用多线程 到了这里你一定会问,增删改查功能已经实现了,用的好好的为什么要使用多线程呢?其实想一想,Co ...
- iphone开发之数据库CoreData
CoreData 介绍 在Cocoa环境下,如果你想使用数据库(如sqlite),你可以使用sql语句的方式通过相关的工具类进行数据库的直接操作.当然你也可以通过别人封装之后的一些简单框架,使得你的操 ...
- 让CoreData更简单些
从简书迁移到掘金 前言 本文并不是CoreData从入门到精通之类的教程, 并不会涉及到过多的原理概念描述, 而是介绍如何让CoreData的使用变得更加简单明了, 方便亲民. 全文约六千字, 预计花 ...
- iOS之coreData
简单说明 coreData是苹果提供的数据本地化的解决方案中的一种,实质还是提供数据库去存储数据,只是在coreData中不需要程序员手动创建数据库文件,由coreData自动创建. coreData ...
- Core Data 多线程操作实战篇
最近在解决百度音乐iPhone客户端偶现数据库操作crash的问题,顺手整理了下CoreData的多线程原则,以及实际开发时应该如何遵守这些原则. Core Data多线程操作的基本原则 不允许跨线程 ...
- iOS CoreData (一) 增删改查
代码地址如下: http://www.demodashi.com/demo/11041.html Core Data是iOS5之后才出现的一个框架,本质上是对SQLite的一个封装,它提供了对象-关系 ...
最新文章
- 修改Visual Studio 2010帮助位置
- PHP输出中文乱码的解决方法
- HDU - 1027 全排列
- python父进程调用子进程_Python2.7下,调用subprocess启动子进程,读取子进程标准输出若干问题...
- C语言中__attribute__ ((at())绝对定位的应用
- python:浅析python 中__name__ = '__main__' 的作用(转载)
- PyTorch之torch.nn.CrossEntropyLoss()
- 重磅推荐,计算机视觉开源周报20191003期
- 你怎么看待中国石油上市以来的表现?
- 学习 Linux LVM
- POJ3274 Gold Balanced Lineup【Hash函数】
- concurrenthashmap_ConcurrentHashMap核心原理,这次彻底给整明白了
- redis数据类型之set入门
- 一步一步学Ruby(五): Class, Module, Object,Kernel的关系
- oracle cube语法,oracle Rollup 和 Cube用法
- mock.js文档详解5及下载(Random中的Name,Web,Address种类函数)
- java技术经理面试题
- mysql设置外部ip访问
- 用node-webkit接入steamAPI
- 吐温20龙沙化工Glycosperse_L-20KFG聚氧乙烯20山梨醇酐单月桂酸酯