[IOS 开发] 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);

//            }

//            

//        }];


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值