CoreData多线程
CoreData中的NSManagedObjectContext在多线程中不安全,如果想要多线程访问CoreData的话,最好的方法是一个线程一个NSManagedObjectContext,每个NSManagedObjectContext对象实例都可以使用同一个 NSPersistentStoreCoordinator实例,这个实例可以很安全的顺序访问永久存储,这是因为 NSManagedObjectContext会在使用NSPersistentStoreCoordinator前上锁。
初始化一个子线程中的管理上下文:
NSManagedObjectContext *pravite = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[pravite setParentContext:self.moc];
//注册通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mocDidSaveNotification:) name:NSManagedObjectContextDidSaveNotification object:nil];
[pravite performBlock:^{ //自定开辟子线程 NSLog(@"%@",[NSThread currentThread]); //执行操作 //同步保存 NSError *error = nil; if ([pravite hasChanges] && ![pravite save:&error]) { NSLog(@"%@",error); abort();//异常终止一个进程 } }];
子线程管理上下文在多线程中执行任务,管理数据,内容发生变化,触发通知,执行通知方法
-(void)mocDidSaveNotification:(NSNotification *)notification{
    NSManagedObjectContext *saveContext = [notification object];
    //主线程中的上下文不用保存
    if (self.moc == saveContext) {
        return;
    }
    //使用一个持久化指针
    if (self.moc.persistentStoreCoordinator!=saveContext.persistentStoreCoordinator) {
        return;
    }
    //在主线程执行合并操作
   dispatch_async(dispatch_get_main_queue(), ^{
       
       [self.moc mergeChangesFromContextDidSaveNotification:notification];
    if([self.moc hasChanges])
     [self.moc save:nil];
   });
}
这样将子线程中的数据合并到主线程的管理上下文中.
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号