zoukankan      html  css  js  c++  java
  • 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);
    
    //            }
    
    //            
    
    //        }];
  • 相关阅读:
    Manage Spring Boot Logs with Elasticsearch, Logstash and Kibana
    接口服务中的日志
    初识Mybatis框架,实现增删改查等操作
    spring mvc 提交数组等复杂类型
    jquery实现漂亮文件上传表单样式
    spring mvc 接收页面表单List
    无刷新上传图片 可以实时预览 选择图片后即自动上传,没有上传按钮
    cvc-complex-type.2.3: Element 'beans' cannot have character [children] 博客分类: Spring
    Maven+SpringMVC+MyBatis 上传图片
    spring mvc 图片上传,图片压缩、跨域解决、 按天生成目录 ,删除,限制为图片代码等相关配置
  • 原文地址:https://www.cnblogs.com/jiqiaochun/p/4877686.html
Copyright © 2011-2022 走看看