我在尝试找出如何同时正确使用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响应而不会对核心数据产生任何影响。
有没有更好的方法来解决这个问题?
答案 0 :(得分:2)
NSPersistentStoreCoordinator
相关联的私有语境。确实没有理由删除主要上下文中的对象(看起来你正在使用你的单例)。
如果您的UI未触及任何要删除的对象,则无需重置与用户界面关联的上下文。
您也可以,而不是进行重置,让主队列上下文使用来自私有队列上下文的保存通知,这将获得相同的结果。