CoreData多线程安全
来源:互联网 发布:苏州博物馆 知乎 编辑:程序博客网 时间:2024/06/06 07:31
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多线程安全
- CoreData多线程安全
- CoreData多线程安全
- CoreData多线程安全
- CoreData多线程安全
- [IOS 开发] CoreData多线程安全
- Coredata多线程
- CoreData线程安全
- iOS代码重构(二)CoreData多线程(支持线程安全)
- 多线程操作数据库 (CoreData)
- 多线程操作数据库 (CoreData)
- coreData 多线程同步
- coredata 多线程操作
- 多线程操作数据库 (CoreData)
- CoreData 多线程使用方法
- 认识CoreData-多线程
- 《高质量C程序编程指南》读书笔记
- 深度学习(十四)基于CNN的性别、年龄识别
- 《机器学习实战》—K-近邻算法
- HDU1038 Biker's Trip Odometer(java)
- Android 夜间模式切换,颜色渐变效果实现
- CoreData多线程安全
- Ubuntu14.04 USB WIFI 连接不稳定解决方法
- Java Object equals方法
- 第五届全国职工职业技能大赛加工中心操作工、数控机床装调维修工决赛落幕决赛成绩
- 链接
- JPushPlugin 客户端 api
- tornado入门,hello world
- 包子的 oracle 学习笔记---ORA异常原因与解决办法
- shell 文件分类