核心数据,并发和GCD

时间:2016-07-17 13:49:35

标签: ios objective-c core-data

我在尝试找出如何同时正确使用Core Data时遇到了困难。

每次有更新时,我必须在添加新数据之前清除实体的核心数据。因此我决定使用这个片段:

-(void)addSale:(NSArray *)results{

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    NSString *entity = @"Sale";

    CoreDataManager.sharedInstance.delegate = self;

    dispatch_async(dispatch_get_main_queue(), ^{
        [CoreDataManager.sharedInstance deleteEntityWithName:entity];
    });

    NSManagedObjectContext *privateContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    privateContext.parentContext = CoreDataManager.sharedInstance.managedObjectContext;

    for (NSDictionary *dataDictionary in [results valueForKey:@"Sales"])
    {
        NSManagedObject *managedObject = [NSEntityDescription insertNewObjectForEntityForName:entity inManagedObjectContext:privateContext];


        // Fill ManagedObject
        // .....

    }

    NSError *error;
    [privateContext save:&error];

    if (error != nil) {
        NSLog(@"Couldn't save private context bcoz of %@\n%@", error, error.localizedDescription);
    }

    dispatch_async(dispatch_get_main_queue(), ^{
        // Save Main ManagedObjectContext
        [CoreDataManager.sharedInstance saveContext:CoreDataManager.sharedInstance.managedObjectContext WithEntityName:entity];
    });
});
}

问题是我必须为其他2个实体做同样的事情,同时保持UI响应而不会对核心数据产生任何影响。

有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:2)

  1. 创建与NSPersistentStoreCoordinator相关联的私有语境。
  2. 删除私人环境中的对象。
  3. 保存私人环境。
  4. 如果正在使用任何这些对象,请告诉主队列上下文重置。
  5. 确实没有理由删除主要上下文中的对象(看起来你正在使用你的单例)。

    如果您的UI未触及任何要删除的对象,则无需重置与用户界面关联的上下文。

    您也可以,而不是进行重置,让主队列上下文使用来自私有队列上下文的保存通知,这将获得相同的结果。